每次面试的时候基本都会被问到jvm的垃圾回收,每次回答的都不是那么的完美,这次来总结一下。
1、概念问题。
a、什么是堆?存放所有的对象实例和数组,是垃圾回收的最主要区域,因此也叫“GC堆”。
b、什么是栈?存放局部变量表(8中基本数据类型,对象引用类型),操作数栈,动态链接,方法出口信息等。
c、什么是方法区?存放类信息,常量,静态变量,即时编译器编译后的代码,在HotSpot上也被成为“永久代”。
d、什么是运行常量池?方法区的一部分,存放编译期存放的字面量和符号引用。
2、相关问题、
a、什么时候开始回收的。当jvm无法为一个对象分配空间出发Minor GC(Eden区满了),每次Minor GC会清理年轻带的内存。多次Minor GC后存活次数达到一定次数后会将这些 对象放到老年代,当升入老年代的对象大于老年代剩余空间发生Major GC,对老年代的对象进行回收。
b、回收的对象是什么?从GC Roots开始进行可达性分析,经过第一次标记后,并调用finalize()方法没有复活的对象。每个对象的该方法只能被调用一次。
GC Roots:虚拟机栈中的对象,方法区里面的静态对象,方法区常量池的对象,本地方法JNI应用对象。
c、怎样回收的?新生代采用复制算法,将新生代分成一个Eden区,两个survivor区(存活率较高),老年代采用标记整理或者标记清理算法。
未完待续。。。