目录
新生代和老年代
新生代
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 的过程:采用复制算法。
- 首先,把 Eden 和 ServivorFrom 区域中存活的对象复制到 ServicorTo 区域(如果有对象的年龄以及达到了老年的标准,一般是 15,则赋值到老年代区)
- 同时把这些对象的年龄 + 1(如果 ServicorTo 不够位置了就放到老年区)
- 然后,清空 Eden 和 ServicorFrom 中的对象;最后,ServicorTo 和 ServicorFrom 互换,原 ServicorTo 成为下一次 GC 时的 ServicorFrom 区。
老年代(Old Generation)
目的:老年代用于存放长时间存活的对象。一些大对象,如果在新生代中无法容纳,也可能直接被分配到老年代。
- 回收频率:老年代的垃圾回收频率较低,但每次回收的时间较长,因为它包含的对象通常更多且更难以确定哪些是垃圾。这种回收称为Major GC或Full GC。
- 空间大小:老年代的空间通常比新生代大,因为它需要存储更长时间存活的对象。
分代垃圾回收的主要优势在于能够根据对象的生命周期采用不同的回收策略,从而提高垃圾回收的效率。由于大部分新创建的对象都是"朝生夕死",新生代采用了适合频繁回收的算法(如复制算法)。而老年代中的对象生命周期长,回收频率低,通常采用标记-清除(Mark-Sweep)或标记-整理(Mark-Compact)算法,以减少垃圾回收对应用性能的影响。
MajorGC
MajorGC 采用标记—清除算法:
- 首先扫描一次所有老年代,标记出存活的对象
- 然后回收没有标记的对象。
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具体区别和使用场景
-
Minor GC:
- 目标:年轻代(Young Generation)。
- 触发条件:年轻代的 Eden 区满。
- 特点:频繁、快速、部分停顿。
- 使用场景:适用于高频率创建对象的场景,如 web 服务器请求处理。
-
Major GC:
- 目标:老年代(Old Generation)。
- 触发条件:老年代空间不足。
- 特点:停顿时间长、回收老年代对象。
- 使用场景:当对象在年轻代存活较长时间并晋升到老年代时。
-
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 详细信息。
调优建议
-
减少 Minor GC 影响:
- 增大年轻代的大小,减少 Minor GC 的频率。
- 调整年轻代的比例,通过 JVM 参数
-Xmn
、-XX:NewRatio
等。 - 优化对象创建和使用,尽量减少短命对象的创建。
-
优化 Major GC 和 Full GC:
- 增大老年代的大小,减少 Major GC 和 Full GC 的触发频率。
- 选择合适的垃圾收集器(如 G1、ZGC、Shenandoah),这些收集器设计用于减少停顿时间。
- 调整垃圾收集器参数,如
-XX:MaxTenuringThreshold
、-XX:InitiatingHeapOccupancyPercent
等。
------------------------------------------与正文内容无关------------------------------------
如果觉的文章写对各位读者老爷们有帮助的话,麻烦点赞加关注呗!作者在这拜谢了!
混口饭吃了!如果你需要Java 、Python毕设、商务合作、技术交流、就业指导、技术支持度过试用期。请在关注私信我,本人看到一定马上回复!
这是我全部文章所在目录,看看是否有你需要的,如果遇到觉得不对地方请留言,看到后我会查阅进行改正。
A乐神-CSDN博客
关注在文章左上角,作者信息处。