Q1 : JVM内存模型,有哪些区,分别的作用?
- 类加载子系统将class文件加载到运行时数据区
- class文件内容会按照规范加载到运行时数据区的不同区域
- 执行引擎通过运行时数据区进行指令执行
运行时数据区分类:
虚拟机栈:
堆内存:
方法区:
Q2: Java 8的内存分代改进?
Q3 : 类加载流程
Q4: 对象什么时候进入老年代?
Q5: Eden和Survivor的比例分配,为什么有两个survivor区?
默认情况下Eden space : Survivor 0 space : Survivor 1 space = 8 : 1 : 1。可通过-XX:SurvivorRatio=8
设置其对应比例。-XX:NewRatio=5
设置老年代和年轻代的比例。
在Minor GC时,会把Eden区和Survivor From区无法回收的对象复制到Survivor To区,以提高GC的效率。
Q6: 永久代会发生垃圾回收嘛?
永久代会发生垃圾回收,但其效率较低。只有在Full GC(老年代空间不足,永久代空间也不足时)时进行。
回收对象主要是:废弃的常量和不再使用的类型
废弃的常量:无引用即可。
不再使用的类型条件:
- 无该类的任何实例对象,包括该类以及其派生子类的所有对象
- 加载该类的类加载器被回收
- 该类的class对象没有被引用,防止反射获取该类的实例