Lokasi ngalangkungan proxy:   [ UP ]  
[Ngawartoskeun bug]   [Panyetelan cookie]                
Skip to content

Latest commit

 

History

History
39 lines (23 loc) · 1.44 KB

File metadata and controls

39 lines (23 loc) · 1.44 KB

垃圾回收

垃圾回收主要思考三件事情:

  • 哪种内存需要回收?
  • 什么时候回收?
  • 怎么回收?

对象是否存活

引用计数法

这是一种非常简单易理解的回收算法。每当有一个地方引用一个对象的时候则在引用计数器上 +1,当失效的时候就 -1,无论什么时候计数器为 0 的时候则认为该对象死亡可以回收了。

这种算法虽然简单高效,但是却无法解决循环引用的问题,因此 Java 虚拟机并没有采用这种算法。

可达性分析算法

可达性算法是通过一个称为 GC Roots 的对象像下搜索,整个搜索路径就称为引用链,当一个对象到 GC Roots 没有任何引用链 JVM 就认为该对象是可以被回收的。

如图:Object1,2,3,4 都是存活的对象,而 Object5、6、7都是可回收对象。

可以用作 GC-Roots 的对象有:

  • 方法区中静态变量所引用的对象。
  • 虚拟机栈中所引用的对象。

垃圾回收算法

标记-清除算法

标记清楚算法分为两个步骤,标记和清除。 首选将需要回收的对象标记起来,然后统一清除。但是存在两个主要的问题:

  • 标记和清除的效率都不高。
  • 清楚之后容易出现不连续内存,当需要分配一个较大内存时就不得不需要进行一次垃圾回收。

分代回收