前言
简单记录一下JVM相关的面试内容
一、新生代
java创建对象在1.7之后默认开启逃逸分析,会把部分小的对象通过栈来分配,某些方法中的对象引用没有被返回或者被外面引用,则会直接在栈上分配内存。
(1)复制算法(MinorGC)把伊甸区和幸存者1区中存活的对象复制到幸存者2区,如果年龄达到了老年代的标准就分配到老年代,同时年龄+1
(2)清空伊甸和幸存者1区
(3)再把幸存者1区和2区互换,下次GC继续清理这些幸存的对象
二、老年代
大对象会直接分配到老年代,标记-清除算法(MajorGC),标记存活的对象,把未标记的清除
三、永久代
主要存放Class和Meta(元数据)的信息,Class加载时被放入永久区域。GC不会再主程序运行期对永久区进行清理,当永久代的Class加载的越来越多会抛出OOM
四、JAVA8的元数据
JAVA8中,永久代被移除,被元数据区(元空间)取代,元空间不在JVM虚拟机中,而使用本地内存。
类的元数据放入内存中,字符串和类的静态变量放入java堆中