我们对上面的一些名词做一些解释
一、什么样的变量可以可以称为起点(GCRoot)呢?
1、局部变量表中的对对象的引用(栈里面的局部变量,栈有多个,每个线程一个,每个栈里面又有很多的栈帧,每个栈帧里有一个自己的局部变量表。)
意思就是:所有线程的所有栈的所有栈帧的所有的局部变量表中的全部的变量,都可视为GCRoot.
2、常量池中对应的对象
3、方法区中,静态引用类型的成员
二、什么叫做”能够被访问到“?
3、确定要回收的对象后,如何具体进行垃圾回收?
有以下几个笔记经典的垃圾回收算法(策略)
1、标记-清除
2、复制算法(为了解决内存碎片化问题)
3、标记整理(类似于顺序表删除元素)
4、分代回收
总结:
在伊甸区,新生的对象,如果活过了一轮GC(一轮GC以及把大部分对象给回收了,活过一轮GC的是少数),就把这些幸存的对象放到幸存区(因为对象少,所以幸存区的空间不大)
幸存区的对象使用复制算法,因为数量较少,即使浪费了一半的内存也没关系。
老年代的对象使用标记整理算法,因为老年代对象他被回收的频率不高,就可以接收标记整理带来的开销
再述分代回收
四、 有关JVM的常见选择题目
GC Roots的判断
JVM的实现
类加载器
垃圾回收器和垃圾回收算法的区别
JVM内存划分