什么是垃圾回收(GC)?
垃圾回收是为了释放那些不在被使用的独享以释放存储空间,提高程序效率。
什么时候需要GC?
当一个对象变得不可达(对象已死)的时候可以回收。
什么是不可达呢?就是一个对象没有在任何地方被引用,则它就是不可达的,可以被回收的。
怎么判断对象是活的还是死的(不可达的)?
1.通过引用计数计数器
为对象设置一个应用计数器,当该对象被引用时,计数器加1,当引用失效时就减1,当计数器的值为0时,则表明没有在任何地方引用到它,可以被GC。但是它无法解决对象之间相互循环引用的问题。
2.通过根搜索算法
通过一系列名为GC Roots的对象向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连(即对象不可达)时就可以判定对象是死的,可以被GC。
Java中可作为GC Root的对象:
虚拟机栈(栈帧中的本地变量表)中引用的对象。
方法区中类静态属性引用的对象。
方法区中常量引用的对象。
本地方法栈中JNI(即一般说的Native方法)引用的对象。
GC回收的主要地方?
GC主要对堆中的对象进行回收,也会对方法区(永久代)进行回收。主要回收两部分内容:废弃常量和无用的类。
废弃的常量:没有任何地方引用的这个常量,则它是废弃的常量,会被移出常量池。
无用的类:
GC回收什么时候进行
GC的时间不确定,具体由虚拟机自己控制,也可以调用gc()方法通知虚拟机需要回收,但是否真正回收还是有虚拟机自己决定。
一个对象至少要被两次标记为可回收才会回收。