Java中的GC机制

GC(Garbage Collection),java中的垃圾回收机制。

Java虚拟机中进行垃圾回收的场所有两个,一个是堆,一个是方法区。方法区通常被称为永久代,垃圾回收的频率较低,速度也较慢。(JDK1.8之后取消永久代改为Metaspace。元空间并不在虚拟机中,而是使用本地内存)

判断是否需要被回收

Java虚拟机采用可达性分析法来判断一个对象是否需要被回收。就是以一系列的称为“GC Roots"的对象作为起始点,从这些结点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。

GC Roots的对象包括:

  • 虚拟机栈中引用的对象;
  • 方法区中类静态属性引用的对象;
  • 方法区中常量引用的对象;
  • 本地方法栈JNI引用的对象;

Java虚拟机在进行死亡对象判定时,如果对象在进行可达性分析后没有与GC Roots相关联的引用链,则该对象会被JVM进行第一次标记并且判断是否执行finalize方法。

如果当前对象没有覆盖该方法,或者finalize方法已经被JVM调用过都会被虚拟机判定为“没有必要执行”,那么该对象将会被放置在一个叫做F-Queue的队列当中,由一个低优先级的Finalizer线程去执行它。

如果在finalize方法中该对象重新与引用链上的任何一个对象建立了关联,例如this关键字,那么该对象就会逃脱垃圾回收系统;如果该对象在finalize方法中没有与任何一个对象进行关联操作,那么该对象会被虚拟机进行第二次标记,该对象就会被垃圾回收系统回收。finaliza方法JVM系统只会自动调用一次,下一次回收,它的finalize方法不会被执行。(躲得了初一,躲不了十五??)

复制算法(Copying):

标记清除算法(Mark-Sweep):

标记整理算法(Mark-Compact):

猜你喜欢

转载自www.cnblogs.com/dream2true/p/10835799.html