【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事件。找出性能瓶颈并进行调优。
相关推荐
花间相见29 分钟前
【JAVA基础03】—— JDK、JRE、JVM详解及原理
java·开发语言·jvm
闻哥1 小时前
深入剖析Redis数据类型与底层数据结构
java·jvm·数据结构·spring boot·redis·面试·wpf
Engineer邓祥浩1 小时前
JVM学习笔记(2) 第一部分 走近java 第1章 走近java
jvm·笔记·学习
jinanmichael2 小时前
【SQL】掌握SQL查询技巧:数据分组与排序
java·jvm·sql
敲敲千反田2 小时前
深入了解JVM
jvm
AMoon丶2 小时前
C++基础-类、对象
java·linux·服务器·c语言·开发语言·jvm·c++
云澜哥哥3 小时前
MyBatis 实战指南:特殊符号处理与高效批量操作
java·jvm·mybatis
Java面试题总结4 小时前
java面试题及答案(基础题122道)
java·开发语言·jvm·spring·spring cloud·golang·java-ee
笨手笨脚の5 小时前
Java 性能优化
java·jvm·数据库·性能优化·分布式锁·分布式事务·并发容器
小陳参上5 小时前
使用Flask快速搭建轻量级Web应用
jvm·数据库·python