什么是垃圾回收(GC)?

垃圾回收是为了释放那些不在被使用的独享以释放存储空间,提高程序效率。

什么时候需要GC?

当一个对象变得不可达(对象已死)的时候可以回收。

什么是不可达呢?就是一个对象没有在任何地方被引用,则它就是不可达的,可以被回收的。

怎么判断对象是活的还是死的(不可达的)?

1.通过引用计数计数器

为对象设置一个应用计数器,当该对象被引用时,计数器加1,当引用失效时就减1,当计数器的值为0时,则表明没有在任何地方引用到它,可以被GC。但是它无法解决对象之间相互循环引用的问题。

2.通过根搜索算法

通过一系列名为GC Roots的对象向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连(即对象不可达)时就可以判定对象是死的,可以被GC。

Java中可作为GC Root的对象

  • 虚拟机栈(栈帧中的本地变量表)中引用的对象。

  • 方法区中类静态属性引用的对象。

  • 方法区中常量引用的对象。

  • 本地方法栈中JNI(即一般说的Native方法)引用的对象。

GC回收的主要地方?

GC主要对堆中的对象进行回收,也会对方法区(永久代)进行回收。主要回收两部分内容:废弃常量和无用的类。

废弃的常量:没有任何地方引用的这个常量,则它是废弃的常量,会被移出常量池。

无用的类:

【jvm】GC笔记(一)_java

GC回收什么时候进行

GC的时间不确定,具体由虚拟机自己控制,也可以调用gc()方法通知虚拟机需要回收,但是否真正回收还是有虚拟机自己决定。

一个对象至少要被两次标记为可回收才会回收。

网络上志同道合,我们一起学习网络安全,一起进步,QQ群:694839022