【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事件。找出性能瓶颈并进行调优。
相关推荐
yyytucj1 小时前
C/C++通过SQLiteSDK增删改查
c语言·jvm·c++
Resean02232 小时前
JVM原理(一):JVM基础知识
java·jvm
Apesource柒玖16 小时前
Java- “equals“和“==“
java·开发语言·jvm
qq_5470261792 天前
JVM基本概念及内存管理模型
java·jvm
悲且狂2 天前
jvm内存不够,怎么重新分配
jvm
zzlyyds2 天前
深入理解三色标记、CMS、G1垃圾回收器
java·jvm·cms·垃圾回收·g1
m0_748232922 天前
2022java面试总结,1000道(集合+JVM+并发编程+Spring+Mybatis)的Java高频面试题
java·jvm·面试
张彦峰ZYF2 天前
显式 GC 的使用:留与去,如何选择?
jvm
艾斯比的日常3 天前
深入解析Java虚拟机(JVM)的核心组成
java·开发语言·jvm
老朋友此林3 天前
从 JVM 源码(HotSpot)看 synchronized 原理
jvm