当前位置: 首页 > news >正文

【jvm】讲讲jvm中的gc

目录

          • 1. 说明
          • 2. 主要算法
          • 2.1 标记-清除算法
          • 2.2 复制算法
          • 2.3 标记-整理算法
          • 3. 主要回收器
            • 3.1 Serial GC
            • 3.2 Parallel GC
            • 3.3 CMS(Concurrent Mark-Sweep)GC
            • 3.4 G1(Garbage-First)GC
          • 4. 触发条件
            • 4.1 Minor GC(Young GC)
            • 4.2 Full GC(Major GC)
          • 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事件。找出性能瓶颈并进行调优。
http://www.lryc.cn/news/499377.html

相关文章:

  • openlayers地图事件
  • 杂记9---一些场景git操作汇总
  • Mysql索引,聚簇索引,非聚簇索引,回表查询
  • 【优选算法 二分查找】二分查找算法入门详解:二分查找小专题
  • 如何将CSDN博客下载为PDF文件
  • pdf转word/markdown等格式——MinerU的部署:2024最新的智能数据提取工具
  • 2024年下半年网络工程师案例分析真题及答案解析
  • English phonetic symbol
  • 普及组集训--图论最短路径设分层图
  • SYN6288语音合成模块使用说明(MicroPython、STM32、Arduino)
  • Spring完整知识三(完结)
  • 保姆级教程Docker部署Redis镜像
  • 子类有多个父类的情况下Super不支持指定父类来调用方法
  • AI大模型ollama结合Open-webui
  • RK3568笔记2:NOR_Flash和NAND_Flash与SDMMC和eMMC
  • windows python qt5 QChartView画折线图
  • 阿里云通义千问:全面解析智能云服务先锋
  • QT 贪吃蛇
  • 二、点亮希望之光:寄存器与库函数驱动 LED 灯
  • Oracle 用户管理模式下的恢复案例-不完全恢复
  • SharpDevelop IDE IViewContent.cs类
  • Unity RectTransUtility工具类
  • React性能优化
  • 前端开发流程实操:从概念到上线
  • Metasploit使用
  • Milvus向量数据库05-常见问题整理
  • Ruby On Rails 笔记3——表的增删改查
  • CSS3 动画详解,介绍、实现与应用场景详解
  • Winston-MySQL 使用文档
  • java日期工具: 获取两个时间段的时间段值,Java获得两个日期之间的所有年、月份、日。