目录
-
-
-
-
- [1. 说明](#1. 说明)
- [2. 主要算法](#2. 主要算法)
- [2.1 标记-清除算法](#2.1 标记-清除算法)
- [2.2 复制算法](#2.2 复制算法)
- [2.3 标记-整理算法](#2.3 标记-整理算法)
- [3. 主要回收器](#3. 主要回收器)
-
- [3.1 Serial GC](#3.1 Serial GC)
- [3.2 Parallel GC](#3.2 Parallel GC)
- [3.3 CMS(Concurrent Mark-Sweep)GC](#3.3 CMS(Concurrent Mark-Sweep)GC)
- [3.4 G1(Garbage-First)GC](#3.4 G1(Garbage-First)GC)
- [4. 触发条件](#4. 触发条件)
-
- [4.1 Minor GC(Young GC)](#4.1 Minor GC(Young GC))
- [4.2 Full GC(Major GC)](#4.2 Full GC(Major GC))
- [5. 优化策略](#5. 优化策略)
-
-
-
1. 说明
- 1.JVM(Java Virtual Machine)中的GC(Garbage Collection)是Java虚拟机提供的一种自动内存管理机制,用于自动回收不再被使用的对象所占用的内存空间。
- 2.GC的基本原理是将内存中不再被使用的对象进行回收,以释放内存资源。
- 3.GC通过一系列算法和机制来判断哪些对象是不再被使用的,并对其进行回收。
2. 主要算法
2.1 标记-清除算法
- 1.首先标记出所有需要被回收的对象。
- 2.然后在标记完成后统一回收掉所有被标记的对象。
- 3.这种方法可能导致内存碎片化问题,从而影响程序性能。
2.2 复制算法
- 1.将内存划分为等大的两块,每次只使用其中的一块。
- 2.当一块内存用完了,触发GC时,将该块中存活的对象复制到另一块内存区域,然后一次性清理掉这块没有用的内存。
- 3.这种算法解决了内存的碎片化问题,但内存利用率不高,每次只能使用一半内存。
- 4.在JVM中,新生代通常使用这种算法。
2.3 标记-整理算法
- 1.标记过程与标记-清除算法相同。
- 2.后续步骤不是直接对可回收对象进行回收,而是让所有存活的对象都向内存的一端移动,然后直接清理掉端边线以外的内存。
- 3.这种算法适用于老年代,因为老年代中对象的存活率较高,复制算法的效率会较低。
3. 主要回收器
3.1 Serial GC
- 1.单线程GC,适用于单CPU环境。
- 2.在进行垃圾回收时,会暂停所有用户线程(Stop The World)。
3.2 Parallel GC
- 1.多线程GC,适用于多CPU环境。
- 2.与Serial GC类似,但使用多线程进行垃圾回收,以提高效率。
3.3 CMS(Concurrent Mark-Sweep)GC
- 1.以获取最短回收停顿时间为目标的GC。
- 2.使用三色标记算法进行标记,并发进行垃圾回收。
- 3.在并发标记阶段,用户线程也在运行,可能会导致标记结果不准确,从而引发更严重的问题(如浮动垃圾)。
3.4 G1(Garbage-First)GC
- 1.面向服务器的垃圾收集器,适用于具有大量内存和多核处理器的机器。
- 2.使用分代收集算法,但不再局限于固定的新生代和老年代区域,而是将整个堆内存划分为多个大小相等的区域(Region)。
- 3.根据对象的存活时间和大小动态调整不同区域的垃圾回收策略。
4. 触发条件
4.1 Minor GC(Young GC)
- 1.当新生代的Eden区域满了时,会触发Minor GC。
- 2.Minor GC会回收Eden区域和Survivor区域中的垃圾对象,并将存活的对象转移到另一个Survivor区域或晋升到老年代。
4.2 Full GC(Major GC)
- 1.当老年代区域满了时,会触发Full GC。
- 2.Full GC会回收整个堆内存(包括新生代和老年代)以及方法区中的垃圾对象。
5. 优化策略
- 1.选择合适的GC算法和回收器:根据应用程序的性质和需求,选择适合的GC算法和回收器。
- 2.调整堆内存大小:适当设置堆内存大小,避免过大或过小的堆对性能产生负面影响。
- 3.避免创建过多临时对象:过多的临时对象会导致频繁的GC事件。可以重用对象或者使用对象池来减少临时对象的创建。
- 4.优化对象的生命周期:尽量使对象的生命周期与其实际使用时间相符。避免长时间存活的对象进入新生代,从而减少老年代的压力。
- 5.监控和调优:使用JVM性能分析工具来监控GC事件。找出性能瓶颈并进行调优。