> 文章列表 > Java垃圾回收机制

Java垃圾回收机制

Java垃圾回收机制

Java垃圾回收机制

  • 垃圾回收算法
    • 为什么垃圾回收
    • 回收哪些内存
    • 如何回收
      • Marking-Sweep(标记-清除法)
      • Marking-Compat(标记-整理法)
  • 内存分代
    • 年轻代
  • Minor gc和Major gc的区别
  • 常见回收器
    • Serial Garbage Collector
    • Parallel Garbage Collector
    • CMS Garbage Collector
    • G1 Garbage Collector

垃圾回收算法

为什么垃圾回收

方便程序员写代码的时候,管理内存。有了这个自动的垃圾回收机制,不需要手动地分配内存和回收内存。这些JVM已经完成。

回收哪些内存

使用可达性分析算法。每个对象都有自己的引用。没有被GC Roots引用的对象都是可以被回收的对象。

Java垃圾回收机制
根对象包括哪些:

  1. 虚拟机栈中的引用的对象
  2. 方法区中的类静态属性引用的对象
  3. 方法区中的常量引用的对象
  4. 本地方法栈中JNI(Native方法)的引用的对象。

如何回收

Marking-Sweep(标记-清除法)

Java垃圾回收机制
Java垃圾回收机制
会产生碎片,可能造成内存不足的问题。

Marking-Compat(标记-整理法)

Java垃圾回收机制

内存分代

Java垃圾回收机制
老年代,空间比较大,主要存放一些比较老的对象。

方法区主要存放一些常量和一些静态属性。

内存分配的第一个代会分配到年轻代中。

分代的原因是因为对象的生命周期不同。

年轻代

Java垃圾回收机制
S1区也称为from区,S2区也称为to区。
首先会在Eden区进行分配,如果空间不足的话,会将Eden中的对象放入到S0中,并且将他们的年龄置为1(1岁):
Java垃圾回收机制
如果S0中内存区域不足的话,会将S0中的对象放到S1中去,且年龄增加一岁,变成2(2岁):
Java垃圾回收机制
下一次则从S1中回到S0, 年龄又加1,不停地交换移动。
Java垃圾回收机制
达到一定年龄后停止,例如8后,则放到老年中,变成9:
Java垃圾回收机制

Minor gc和Major gc的区别

老年代回收频率比较低,不如年轻代,年轻代中多是朝生夕死的对象。老年代中存放的对象多是年龄比较高而且比较大的对象。老年代回收称为Major gc。
Java垃圾回收机制

常见回收器

Serial Garbage Collector

单线程GC

Parallel Garbage Collector

多线程GC

CMS Garbage Collector

多线程GC

G1 Garbage Collector

jdk7引进GC,多线程,高并发,低延迟。逐步取代CMS GC。

参考资料:【Java面试题】Java垃圾回收机制