JVM垃圾回收(Garbage Collection)机制

1、定义描述

Java的垃圾回收(Garbage Collection,GC)机制是Java虚拟机(JVM)的一项关键功能,旨在自动管理内存,回收不再使用的对象,保证程序运行过程中不出现内存泄漏和内存溢出。

2、回收位置

VM内存结构中,垃圾回收的主要工作集中在堆内存区域(回收无引用或循环的废弃对象实例)。

其他内存区域,如方法区(存储元数据,常量、静态变量和即将编译的代码,垃圾回收不频繁,且不如堆内存高效)、虚拟机栈(栈内存的分配和回收是确定性的,即在方法开始和结束时进行,并不需要垃圾回收机制)、本地方法栈(用于JNI调用的,属于线程私有的内存区域,内存分配与线程生命周期相同,也不需要垃圾回收机制)和程序计数器(也属线程私有,不需要垃圾回收机制),通常不在垃圾回收的管理范围之内

3、垃圾回收器

作用

1、识别不再使用的对象

垃圾回收器的首要任务是识别哪些对象是不再使用的。这通常通过以下两种方式实现:

- 引用计数法:为每个对象维护一个引用计数器,当对象被引用时计数器增加,引用失效时计数器减少,计数器为零的对象即为不可达对象。
- 可达性分析(Reachability Analysis):从GC Roots(一组对象集合,对应各内存数据区中会引用其他对象的对象,如虚拟机栈中引用的对象,方法区中类静态属性、常量引用的对象,本地方法栈中JNI引用的对象)出发,通过引用关系遍历对象图,未被遍历到的对象即为不可达对象(可被回收)。

2、 回收不再使用的对象

垃圾回收算法
确定不可达对象后,垃圾回收器会回收这些对象占用的内存,使其重新可用。主要有以下几种算法:

- 标记-清除(Mark-Sweep):
  - 标记阶段:从GC Roots出发,标记所有可达对象。
  - 清除阶段:遍历堆,回收未标记的对象。
  
- 标记-整理(Mark-Compact):
  - 标记阶段:同标记-清除算法。
  - 整理阶段:将存活的对象向内存一端移动,整理内存空间,回收多余的内存,防止内存碎片化问题。

- 复制(Copying):
  - 将内存分为两个等大小的空间,每次使用其中一个。
  - 当一个空间用满时,将存活对象复制到另一个空间,并清除原空间。

3.、管理不同代的内存

堆内存通常分为新生代和老年代,不同年代的垃圾回收策略有所不同:

- 新生代(Young Generation)包括伊甸园(Eden)区和幸存者(Survivor)区(包含一个From一个To区):
  - 对象生命周期较短,采用复制算法。
  - Minor GC:当伊甸园(Eden)区满时触发,会将伊甸园区和一个From区中的废弃对象清除,将这俩区中存活的对象复制到To区,下一次GC时To区则被视为From区,进行同样的操作,这样多次操作后在幸存者区的其中一个区中则会存在多次未被GC的对象,一般15次左右,这些对象会被移入老年代存储,减少新生代的内存压力。

- 老年代(Old Generation):
  - 对象生命周期较长,采用标记-清除或标记-整理算法。
  - Major GC(或Full GC):当老年代空间不足时触发,进行全堆回收,通常比Minor GC更耗时。

4、优化回收性能

垃圾回收器的另一个重要职责是优化回收性能,以减少GC对应用程序的影响。这包括:

- 并行回收:使用多线程进行垃圾回收,提高回收效率,如Parallel GC。
- 并发回收:在应用程序运行的同时进行垃圾回收,减少停顿时间,如CMS GC。
- 区域化回收:将内存分为多个区域,优先回收垃圾最多的区域,如G1 GC。

 类型

1. Serial GC:单线程,适用于单核处理器和小堆内存。
2. Parallel GC:多线程,适用于多核处理器和大堆内存。
3. CMS GC:低停顿时间,适用于需要响应迅速的应用。
4. G1 GC:适用于大内存和多处理器环境,提供可预测的停顿时间。

 应用

开发者可以通过JVM参数配置和调优垃圾回收器,以满足特定应用的需求。例如:

- 选择垃圾回收器:
  -XX:+UseSerialGC
  -XX:+UseParallelGC
  -XX:+UseConcMarkSweepGC
  -XX:+UseG1GC

4、垃圾回收流程

由垃圾回收器主导了垃圾的回收流程:

1、由垃圾回收器进行垃圾分析
2、由垃圾回收器进行垃圾回收

你可能感兴趣的:(jvm)