【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事件。找出性能瓶颈并进行调优。
相关推荐
日月星宿~12 小时前
【JVM】GC
jvm
小小小小关同学14 小时前
【JVM】垃圾收集器详解
java·jvm·算法
日月星宿~15 小时前
【JVM】调优
java·开发语言·jvm
wclass-zhengge16 小时前
03垃圾回收篇(D3_垃圾收集器的选择及相关参数)
java·jvm
翻晒时光19 小时前
Java 多线程与并发:春招面试核心知识
java·jvm·面试
秋夫人1 天前
jvm G1 垃圾收集日志分析示例(GC)
jvm
天天向上杰1 天前
简识JVM的栈帧优化共享技术
java·jvm
讓丄帝愛伱1 天前
不重启JVM,替换掉已经加载的类
jvm
qq_312738451 天前
jvm学习总结
jvm·学习
天天向上杰1 天前
简识JVM栈中的程序计数器
jvm