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

news2025/1/18 10:42:39

目录

新生代和老年代

新生代

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.coloradmin.cn/o/1720001.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

php反序列化学习(2)

1、魔术方法触发规则: 魔术方法触发的前提是:魔法方法所在类(或对象)被调用 分析代码,_wakeup()的触发条件是进行反序列化,_tostrinng()触发的条件是把对象当成字符串调用,但是魔术方法触发的前…

运维系列.Linux下的用户管理

运维系列 Linux下的用户管理 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/ar…

python实现BMP图像位图法隐藏信息

内容安全实验信息隐藏技术 使用位图法修改BMP图像隐藏信息 我们先了解一下BMP图像的信息 bmp图像文件头和图像信息表 位图法隐藏和传递信息 (1)本机首先将要隐藏和传递的原始信息记录下来 abc 。 (2&#xf…

【康耐视国产案例】AI视觉相机创新 加速商超物流数智化转型

连锁商超/零售店正面临着因消费者购物习惯改变等挑战,迎来了以新兴技术崛起而催生的数字化物流体系转型需求。物流行业与AI机器视觉的深度融合,解决了传统机器视觉识别速度慢、环境要求高、定制化部署耗时过多等痛点,大大提高了物流供应链的效…

ai虚拟主播自动切换的实现

前段时间,看到b站突然冒出很多ai主播,输入数字切换小姐姐.感觉挺有趣.思考了以下决定手动实现一下. 然后就陷入长达5天的踩坑中 由于是自建的webrtc服务器,很自然的想直接收流转发,这也是最优的方案, 然而实际上遇到许多不是很友好的bug, 然后再想使用rtp转发,依然不理想. 最后…

思科防火墙 网线连接的端口还是down 已配置 端口还是down

环境: 思科防火墙fpr-2100 isco Firepower 2100 系列防火墙是思科系统(Cisco Systems)推出的一款中端网络安全和防火墙设备。这一系列的产品主要针对中到大型企业的需求,提供高性能的威胁防护和网络流量管理功能。 问题描述&am…

基于百度智能体平台快速搭建Java学习助手

文章目录 前言什么是文新智能体平台?Java学习助手智能体搭建智能体效果智能体入口文新智能体体验感受 前言 一个Java初学者在学习Java时可能不知道从哪下手,一个工作了3年的Java开发遇到瓶颈期不知如何提升自己,此时,如果有一个老…

CMake的原理与使用方法

一.为什么需要CMake,什么是CMake 1.由于各种make工具遵循不同的规范和标准,所执行的Makefile格式也不同,例如 GNU Make ,QT 的 qmake ,微软的 MS nmake,BSD Make(pmake),…

2024年上半年系统架构设计师——案例第四题——智能汽车相关

写在前面 趁着还记得请,留个纪念。MongoDB的概念完全没记,综合下来只好选这个了。 这题基本上是有自动驾驶背景知识的人的福音,也是第一次考的和现代热点前沿技术相关的内容,而不是考些老嵌入式架构的(上一次看到的还…

单片机串口接收负数的处理方法

dp80中有很多外设处理相关的都是有符号数据。 如dpm计算的结果,插入dpm后有时候会得到0xFFFFFFFE-2(从调试界面也可以看到)。

如何在Windows 10上更改默认系统字体,这里有详细步骤

Windows 10的默认系统字体Segoe UI看起来相当不错。但是,如果你有更好的替代品,你可以更改Windows 10 PC上的默认系统字体。我们将向你展示如何执行此操作。 如何使用注册表编辑器更改默认系统字体 在撰写本文时,“设置”和“控制面板”都没有更改默认系统字体的选项。这意…

信息素养大赛晋级复赛,你们都刷题库了吗?

2024年全国青少年信息素养大赛初赛成绩之前发布了,今天同学们可以查询是否晋级信息素养大赛复赛了,复赛应该会难度比较大,7月复赛,8月全国总决赛,据6547网题库获悉,今年初赛的人数近22万人。 查询方式&…

QT打包成exe文件运行(非安装包)

在QT Creator里面构建那里,点击Release构建完会生成类似这样的文件夹 文件生成的路径在项目概要里面 在该文件里面可以看到release文件夹,release进去后就可以看到有个exe文件,但是还需要导入一些三方库,目前点击会出现类似的错误…

解决bind error: Address already in use

是端口复用问题 产生原因 程序突然退出系统但是没有释放端口 问题解决 首先通过 //显示进程信息 ps -la //杀死相关进程 kill -9 xxxx然后添加socket设置 int on1; if(setsockopt(lfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on))<0){perror("setsockopt")…

【主动均衡和被动均衡】

文章目录 1.被动均衡2.主动均衡1.被动均衡 被动均衡一般通过电阻放电的方式,对电压较高的电池进行放电,以热量形式释放电量,为其他电池争取更多充电时间。这样整个系统的电量受制于容量最少的电池。充电过程中,锂电池一般有一个充电上限保护电压值,当某一串电池达到此电压…

三十二篇:转化决策为行动:探索决策支持系统的深层价值

转化决策为行动&#xff1a;探索决策支持系统的深层价值 1. DSS的精髓&#xff1a;定义与核心功能 1.1 定义与作用 在现代商业的快速演变中&#xff0c;决策支持系统&#xff08;Decision Support Systems, DSS&#xff09;已成为企业获得竞争优势的重要工具。DSS是一种利用先…

golang语言的gofly快速开发框架如何设置多样的主题说明

本节教大家如何用gofly快速开发框架后台内置设置参数&#xff0c;配置出合适项目的布局及样式、主题色&#xff0c;让你您的项目在交互上加分&#xff0c;也是能帮你在交付项目时更容易得到客户认可&#xff0c;你的软件使用客户他们一般都是不都技术的&#xff0c;所以当他们拿…

Jmeter实战教程入门讲解

前言 通过前面对Jmeter元件的讲解&#xff0c;大家应该都知道常用元件的作用和使用了。编写Jmeter脚本前我们需要知道Jmeter元件的执行顺序&#xff0c;可以看看我这篇性能测试学习之路&#xff08;三&#xff09;—初识Jmeter来了解下。下面我将以工作中的一个简单的实例带大…

基于开源项目ESP32 SVPWM驱动无刷电机开环速度测试

基于开源项目ESP32 SVPWM驱动无刷电机开环速度测试 ✨本篇硬件电路和代码来源于此开源项目&#xff1a;https://github.com/MengYang-x/STM3F401-FOC/tree/main&#x1f4cd;硬件电路和项目介绍&#xff0c;立创开源广场&#xff1a;https://oshwhub.com/shadow27/tai-yang-nen…

http协议及httpd安装组成

文章目录 一、http协议http协议通信过程http相关技术网站访问量HTTP工作机制HTTP协议版本HTTP请求访问的完整过程HTTP报文头部响应报文 二、httpd安装组成apache介绍和特点工作模式&#xff08; MPM multi-processing module &#xff09;Http相关文件Http编译安装httpd常见配置…