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

目录

新生代和老年代

新生代

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博客

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/667591.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【教程】自监督 对比学习,代码,爽学一波

from: https://docs.lightly.ai/self-supervised-learning/examples/simclr.html

1114 全素日

你好哇&#xff0c;新的一天开始啦&#xff01; solution 取数值的不同部分&#xff0c;联想到借助string #include<iostream> #include<string> using namespace std; bool judge(string s){int n atoi(s.c_str());if(n 1 || n 0) return false;for(int i 2…

基于51单片机的超声波测距—数码管显示

基于51单片机的超声波测距 &#xff08;仿真&#xff0b;程序&#xff0b;原理图&#xff0b;PCB&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.HC-SR04模块测量距离&#xff0c;LED数码管显示距离&#xff1b; 2.测量范围&#xff1a;2cm-400cm&…

深度学习中的模型架构详解:RNN、LSTM、TextCNN和Transformer

深度学习中的模型架构详解&#xff1a;RNN、LSTM、TextCNN和Transformer 文章目录 深度学习中的模型架构详解&#xff1a;RNN、LSTM、TextCNN和Transformer循环神经网络 (RNN)RNN的优点RNN的缺点RNN的代码实现 长短期记忆网络 (LSTM)LSTM的优点LSTM的缺点LSTM的代码实现 TextCN…

[每周一更]-(第99期):MySQL的索引为什么用B+树?

文章目录 B树与B树的基本概念B树&#xff08;Balanced Tree&#xff09;B树&#xff08;B-Plus Tree&#xff09;对比 为什么MySQL选择B树1. **磁盘I/O效率**2. **更稳定的查询性能**3. **更高的空间利用率**4. **并发控制** 其他树结构的比较参考 索引是一种 数据结构&#x…

文件夹损坏0字节:全面解析、恢复技巧与预防策略

在数字时代&#xff0c;数据的完整性和安全性至关重要。然而&#xff0c;我们时常会遭遇文件夹损坏并显示为0字节的棘手问题。这种情况一旦发生&#xff0c;用户可能会面临数据丢失的风险。本文将详细探讨文件夹损坏0字节的现象&#xff0c;分析其背后的原因&#xff0c;并提供…

Java对象的比较——equals方法,Comparable接口,Comparator接口

Java对象的比较——equals方法&#xff0c;Comparable接口&#xff0c;Comparator接口 1. equals方法2. Comparable接口3. Comparator接口 1. equals方法 在判断两个整数是否相同时&#xff0c;我们可以使用以下方式&#xff1a; System.out.println(1 2); System.out.printl…

【传知代码】基于知识引导提示的因果概念提取(论文复现)

前言&#xff1a;在当今信息爆炸的时代&#xff0c;我们被海量的数据所包围&#xff0c;然而&#xff0c;这些数据中的真正价值往往隐藏在深层的因果关系之中。无论是科学研究、商业决策&#xff0c;还是日常生活中的选择&#xff0c;理解并准确把握事物之间的因果关系&#xf…

Nginx 文件下载 限速设置 限制访问频率 下载速率 并发连接数 简单实用教程

1 没有限速之前 2 nginx配置 #增加如下配置 limit_conn_zone $binary_remote_addr zoneaddr:10m; location / {limit_conn addr 1; #按照来源&#xff0c;限制每个IP 的连接数为1limit_rate_after 1000k;不限速下载的数据量limit_rate 100k; #限制最大传输速率root /data/log…

Lesson6--排序(初级数据结构完结篇)

【本节目标】 1. 排序的概念及其运用 2. 常见排序算法的实现 3. 排序算法复杂度及稳定性分析 1.排序的概念及其运用 1.1排序的概念 排序 &#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来…

随身wifi和手机流量卡,你知道该怎么选吗?

网络已经成为我们这个时代的代名词&#xff01; 那么&#xff0c;在上网的时代&#xff0c;我们有很多问题都要考虑&#xff0c;比如如何选择上网方式&#xff0c;是选择一张流量卡&#xff0c;还是一个随身WIFI&#xff1f; 听小编一句劝&#xff0c;先不要着急买&#xff0c…

2024年中国CRM行业发展方向和前景 | 《连接型CRM》文章精选

01、创新突破&#xff0c;技术为本 中国经济发展处于增速换挡期&#xff0c;企业数字化需求旺盛&#xff0c;同时云计算、大数据、物联网、区块链、5G等新技术的发展&#xff0c;为CRM系统的应用与发展提供了更多的机遇和可能。 近些年来&#xff0c;技术的发展对CRM的重要性…

打造你的专属Vue组件:超实用“高级筛选弹窗组件“实战

打造你的专属Vue组件&#xff1a;超实用“高级筛选弹窗组件“实战 在现代前端开发中&#xff0c;组件化思想是提高开发效率、维护性和代码复用性的关键。本文将通过一个实例——创建一个自定义的“高级筛选”弹窗组件&#xff0c;来展示如何在Vue框架下利用Composition API和E…

AI图书推荐:使用GPT-4和ChatGPT开发AI应用APP

这本书是面向想要学习如何使用大型语言模型构建应用程序的 Python 开发人员的全面指南。作者 Olivier Caelen 和 Marie-Alice Blete 涵盖了 GPT-4 和 ChatGPT 的主要特征和好处&#xff0c;并解释了它们的工作原理。您还将获得使用 GPT-4 和 ChatGPT Python 库开发应用程序的逐…

解决3D模型变黑及贴图不显示的问题---模大狮模型网

在3D建模和渲染过程中&#xff0c;模型变黑或贴图不显示是常见的挑战之一。这不仅影响了模型的视觉效果&#xff0c;还可能导致后续的工作流程受阻。本文将针对这两个问题&#xff0c;提供详细的解决方法和步骤&#xff0c;帮助读者快速有效地解决问题。 一、检查并调整光照设置…

【SpringBoot】怎么在一个大的SpringBoot项目中创建多个小的SpringBoot项目,从而形成子父依赖

父子项目工程创建 步骤 先创建父项目 具体操作步骤请看本文章&#xff1a;使用maven工程创建spring boot项目 创建子项目 file- project structure module–new module 剩下步骤请看创建父工程时的操作使用maven工程创建spring boot项目 应用 确认即可 之后创建启动类…

【实战JVM】-实战篇-05-内存泄漏及分析

【实战JVM】-实战篇-05-内存泄漏及分析 1 内存溢出和内存泄漏1.1 常见场景1.2 解决内存溢出的方法1.2.1 发现问题1.2.1.1 top1.2.1.2 ViusalVM1.2.1.3 arthas1.2.1.4 PrometheusGrafana 1.2.2 堆内存状况对比1.2.3 内存泄漏原因-代码中1.2.3.1 equals()-hashCode()1.2.3.2 内部…

倪师哲学。能让我好,我就接受

还有有些人更搞笑的是&#xff0c;把自己的行为啊&#xff0c;建立在别人的基础之上&#xff0c;如果那个人么样对我&#xff0c;我肯定能怎么样对这个人。 生而为人呐&#xff0c;你是一个独立的人&#xff0c;不要去总是拿着各种各样的前提&#xff0c;来限制了自己个人的成长…

工作流 Activiti7 初始

文章目录 ☃️1.1 Activiti 介绍☃️1.2 Activiti 开发流程☃️1.3 BPMN 2.0 规范是什么☃️1.4 BPMN 2.0 基本流程符号❄️❄️1.4.1 事件 Event❄️❄️1.4.2 活动❄️❄️1.4.3 网关 Gateway ☃️1.5 Activiti API 服务接口❄️❄️1.5.1 核心Service接口及其获取 ☃️1.1 A…

单片机按键处理模块

一 介绍 1.key_board用于单片机中的小巧多功能按键支持&#xff0c;软件采用了分层的思想&#xff0c;并且做到了与平台无关&#xff0c;用户只需要提供按键的基本信息和读写io电平的函数即可&#xff0c;非常方便移植&#xff0c;同时支持多个矩阵键盘及多个单io控制键盘。 …