【jvm】讲讲jvm中的gc

目录

          • [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事件。找出性能瓶颈并进行调优。
相关推荐
NEFU AB-IN3 小时前
Prompt Gen Desktop 管理和迭代你的 Prompt!
java·jvm·prompt
唐古乌梁海9 小时前
【Java】JVM 内存区域划分
java·开发语言·jvm
众俗9 小时前
JVM整理
jvm
echoyu.10 小时前
java源代码、字节码、jvm、jit、aot的关系
java·开发语言·jvm·八股
代码栈上的思考1 天前
JVM中内存管理的策略
java·jvm
thginWalker1 天前
深入浅出 Java 虚拟机之进阶部分
jvm
沐浴露z1 天前
【JVM】详解 线程与协程
java·jvm
thginWalker1 天前
深入浅出 Java 虚拟机之实战部分
jvm
程序员卷卷狗3 天前
JVM 调优实战:从线上问题复盘到精细化内存治理
java·开发语言·jvm
Sincerelyplz3 天前
【JDK新特性】分代ZGC到底做了哪些优化?
java·jvm·后端