Jvm(二)新生代和老年代与GC回收

devtools/2024/12/22 2:24:26/

目录

新生代和老年代

新生代

MinorGC

老年代(Old Generation)

MajorGC

Minor GC、Major GC 和 Full GC

三个GC具体区别和使用场景

JVM GC及内存调优的参数

调优建议


前言-与正文无关

​    生活远不止眼前的苦劳与奔波,它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中,我们往往容易陷入工作的漩涡,忘记了停下脚步,感受周围的世界。让我们一起提醒自己,要适时放慢脚步,欣赏生活中的每一道风景,享受与家人朋友的温馨时光,发现那些平凡日子里隐藏的幸福时刻。因为,这些点点滴滴汇聚起来的,才是构成我们丰富多彩生活的本质。希望每个人都能在繁忙的生活中找到自己的快乐之源,不仅仅为了生存而工作,更为了更好的生活而生活.

​       送你张美图!希望你开心!

新生代和老年代


在Java虚拟机(JVM)的垃圾回收机制中,堆内存被分为几个区域,主要包括新生代(Young Generation)和老年代(Old Generation)。这种划分主要是基于对象的生命周期。

 主要看第二章图上图只是说叫法不同时的样子,一个Eden空间和两个幸存者(Survivor)空间(通常称为S0和S1或From和To)

新生代

新生代用于存放新创建的对象。大多数情况下,Java对象大部分是短命的,因此新生代通常较小,且频繁进行垃圾回收。

  • 结构:新生代通常进一步分为三个区:一个Eden空间和两个幸存者(Survivor)空间(通常称为S0和S1或From和To)。大部分新创建的对象首先被分配到Eden区。当进行垃圾回收时,存活的对象会从Eden区移动到一个Survivor空间,而在Survivor空间中已经存活了一段时间的对象最终会被移动到老年代。
  • 回收频率:新生代的垃圾回收频率较高,但每次回收的速度较快,这种回收称为Minor GC。

MinorGC

MinorGC 的过程:采用复制算法。

  1. 首先,把 Eden 和 ServivorFrom 区域中存活的对象复制到 ServicorTo 区域(如果有对象的年龄以及达到了老年的标准,一般是 15,则赋值到老年代区)
  2. 同时把这些对象的年龄 + 1(如果 ServicorTo 不够位置了就放到老年区)
  3. 然后,清空 Eden 和 ServicorFrom 中的对象;最后,ServicorTo 和 ServicorFrom 互换,原 ServicorTo 成为下一次 GC 时的 ServicorFrom 区。

老年代(Old Generation)

目的:老年代用于存放长时间存活的对象。一些大对象,如果在新生代中无法容纳,也可能直接被分配到老年代。

  • 回收频率:老年代的垃圾回收频率较低,但每次回收的时间较长,因为它包含的对象通常更多且更难以确定哪些是垃圾。这种回收称为Major GC或Full GC。
  • 空间大小:老年代的空间通常比新生代大,因为它需要存储更长时间存活的对象。

        分代垃圾回收的主要优势在于能够根据对象的生命周期采用不同的回收策略,从而提高垃圾回收的效率。由于大部分新创建的对象都是"朝生夕死",新生代采用了适合频繁回收的算法(如复制算法)。而老年代中的对象生命周期长,回收频率低,通常采用标记-清除(Mark-Sweep)或标记-整理(Mark-Compact)算法,以减少垃圾回收对应用性能的影响。

MajorGC

MajorGC 采用标记—清除算法:

  1. 首先扫描一次所有老年代,标记出存活的对象
  2. 然后回收没有标记的对象。

MajorGC 的耗时比较长,因为要扫描再回收。MajorGC 会产生内存碎片,为了减少内存损耗,我们一般需要进行合并或者标记出来方便下次直接分配。

当老年代也满了装不下的时候,就会抛出 OOM(Out of Memory)异常。

Minor GC、Major GC 和 Full GC

在 Java 虚拟机(JVM)中,垃圾收集(GC)机制用于自动管理内存,回收不再使用的对象。GC 主要分为三类:Minor GC、Major GC 和 Full GC。这三类 GC 在工作机制、触发条件和影响上有所不同。下面是对这三类 GC 的详细解释及其区别:

Full GC

  • 针对整个堆(包括年轻代和老年代)和方法区进行垃圾收集。全面扫描和回收整个堆和方法区的对象,包括年轻代、老年代和方法区。通常会进行标记、清除和压缩。
  • Full GC:涉及整个堆和方法区,停顿时间更长。频率更低,但对应用性能影响最大,应尽量避免频繁 Full GC。

三个GC具体区别和使用场景

  1. Minor GC

    • 目标:年轻代(Young Generation)。
    • 触发条件:年轻代的 Eden 区满。
    • 特点:频繁、快速、部分停顿。
    • 使用场景:适用于高频率创建对象的场景,如 web 服务器请求处理。
  2. Major GC

    • 目标:老年代(Old Generation)。
    • 触发条件:老年代空间不足。
    • 特点:停顿时间长、回收老年代对象。
    • 使用场景:当对象在年轻代存活较长时间并晋升到老年代时。
  3. Full GC

    • 目标:整个堆(年轻代、老年代)和方法区。
    • 触发条件:显式调用 System.gc()、老年代满、方法区满等。
    • 特点:停顿时间最长、全面回收。
    • 使用场景:通常应尽量避免频繁触发 Full GC,可通过调整内存配置和优化代码来减少 Full GC 的频率。

JVM GC及内存调优的参数

  • -Xms2g:初始化推大小为 2g;
  • -Xmx2g:堆最大内存为 2g;
  • -XX:NewRatio=4:设置年轻的和老年代的内存比例为 1:4;
  • -XX:SurvivorRatio=8:设置新生代 Eden 和 Survivor 比例为 8:2;
  • –XX:+UseParNewGC:指定使用 ParNew + Serial Old 垃圾回收器组合;
  • -XX:+UseParallelOldGC:指定使用 ParNew + ParNew Old 垃圾回收器组合;
  • -XX:+UseConcMarkSweepGC:指定使用 CMS + Serial Old 垃圾回收器组合;
  • -XX:+PrintGC:开启打印 gc 信息;
  • -XX:+PrintGCDetails:打印 gc 详细信息。

调优建议

  1. 减少 Minor GC 影响

    • 增大年轻代的大小,减少 Minor GC 的频率。
    • 调整年轻代的比例,通过 JVM 参数 -Xmn-XX:NewRatio 等。
    • 优化对象创建和使用,尽量减少短命对象的创建。
  2. 优化 Major GC 和 Full GC

    • 增大老年代的大小,减少 Major GC 和 Full GC 的触发频率。
    • 选择合适的垃圾收集器(如 G1、ZGC、Shenandoah),这些收集器设计用于减少停顿时间。
    • 调整垃圾收集器参数,如 -XX:MaxTenuringThreshold-XX:InitiatingHeapOccupancyPercent 等。

------------------------------------------与正文内容无关------------------------------------
 如果觉的文章写对各位读者老爷们有帮助的话,麻烦点赞加关注呗!作者在这拜谢了!

混口饭吃了!如果你需要Java 、Python毕设、商务合作、技术交流、就业指导、技术支持度过试用期。请在关注私信我,本人看到一定马上回复!

这是我全部文章所在目录,看看是否有你需要的,如果遇到觉得不对地方请留言,看到后我会查阅进行改正。

A乐神-CSDN博客

关注在文章左上角,作者信息处。

 


http://www.ppmy.cn/devtools/45988.html

相关文章

[数据集][目标检测]水下管道泄漏破损检测数据集VOC+YOLO格式2069张2类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2069 标注数量(xml文件个数):2069 标注数量(txt文件个数):2069 标注…

备战十一届大唐杯国赛预选赛

这次省赛带了太多个省一了,具体可看下面的图片,只放了一部分。目前根据可靠消息,应该还有个预选赛和去年一样,就是还会考一次仿真。如果说通过了就是国二起步然后去北方工业争夺国一国二,没过的话就是国三。 每…

设计模式深度解析:分布式与中心化

设计模式在软件开发中扮演着至关重要的角色,它们提供了一套经过验证的解决方案,用于解决常见的设计问题。在分布式和中心化这两种不同的系统架构中,设计模式的应用也有所不同。以下是对这两种架构下设计模式的深度解析: 分布式系统设计模式 在分布式系统中,由于系统被拆…

【linux】(2)文件内容排序sort

sort 是一个用于排序文件内容的命令行工具,在 Linux 和 Unix 系统中非常常用。 基本用法 sort [OPTION]... [FILE]...常用选项 按数值排序 -n sort -n filename例子:对包含数值的文件进行排序。 按字典顺序排序 -d sort -d filename例子&#xff1…

Flutter 中的 SliverAppBar 小部件:全面指南

Flutter 中的 SliverAppBar 小部件:全面指南 Flutter 是一个现代的 UI 框架,它允许开发者使用 Dart 语言来构建跨平台的移动、Web 和桌面应用。在 Flutter 的丰富组件库中,SliverAppBar 是一个强大的滚动效果组件,它为应用栏&…

性能飙升50%,react-virtualized-list如何优化大数据集滚动渲染

在处理大规模数据集渲染时,前端性能常常面临巨大的挑战。本文将探讨 react-virtualized-list 库如何通过虚拟化技术和 Intersection Observer API,实现前端渲染性能飙升 50% 的突破!除此之外,我们一同探究下该库还支持哪些新的特性…

12.Redis之补充类型渐进式遍历

1.stream 官方文档的意思, 就是 stream 类型就可以用来模拟实现这种事件传播的机制~~stream 就是一个队列(阻塞队列)redis 作为一个消息队列的重要支撑属于是 List blpop/brpop 升级版本.用于做消息队列 2.geospatial 用来存储坐标 (经纬度)存储一些点之后,就可以让用户给定…

实验室原始记录电子化管理的发展及应用

实验室原始记录电子化管理的发展及应用,主要体现在以下几个方面: 一、发展背景与意义 随着科技的进步和实验室管理的现代化,实验室原始记录电子化发展已成为必然趋势。传统的实验室原始记录方式主要依赖于纸质文档,这种方式存在诸…