《JVM由浅入深学习【六】 2024-01-10》JVM由简入深学习提升分享

目录

    • 1.jvm堆内存分代模型
    • 介绍一下JVM中堆的垃圾回收过程
      • 堆的结构
      • 新生代的垃圾回收流程
        • 1. Minor GC
        • 2. Full GC
        • 总结
      • 什么是老年代空间分配担保机制
      • 什么情况下对象会进入老年代?
      • JVM 运行时数据区 元空间的特点及作用?
      • 结语:

1.jvm堆内存分代模型

在这里插入图片描述

介绍一下JVM中堆的垃圾回收过程

当Java应用程序运行时,它在堆内存中分为新生代(Young Generation)、老年代(Old Generation)和持久代(Permanent Generation,Java 8之后被元数据区替代)等几个区域。新生代主要用于存放新创建的对象,而垃圾回收主要集中在新生代进行。

堆的结构

  1. 新生代(Young Generation):包括三个区域,Eden空间和两个Survivor空间(通常命名为S0和S1)。对象首先在Eden空间分配,经过一轮Minor GC 后如果仍然存活,则会被移到Survivor空间,经过多次(minor15次,cms收集器默认6次)后会晋升到老年代。当然可以自己设置次数,下面是官方文档
    **注意:**即使对象的年龄尚未达到设定的阈值,如果Survivor区中的空间占用超过50%,这些对象也可能被提前晋升到老年代。这是因为为了避免Survivor区溢出,JVM可能会进行提前晋升。
    结论–>动态年龄判断: Survivor 区的对象年龄从小到大进行累加,当累加到 X 年龄 (某个年龄)时占用空间的总和大于50% (可以使用-XX:TargetSurvivorRatio=? 来设置保留多少空闲空间,默认值是 50) ,那么比 X 年龄大的对象都会晋升到老年代 在这里插入图片描述3. 这两个可以查看垃圾回收器默认值在这里插入图片描述

  2. 老年代(Old Generation):用于存放生命周期较长的对象,经过多次Minor GC(15次的s区域来回回收,这里次数也称为年龄,即15岁进入到老年代)或者经过一次Full GC后的对象会晋升到这个区域。

  3. 持久代(Permanent Generation):在Java 7及之前,主要用于存放类的元数据信息,包括类的结构、方法等。在Java 8及之后,被元数据区替代。

新生代的垃圾回收流程

新生代的垃圾回收主要分为两个阶段:Minor GC和Full GC。

1. Minor GC
  • 触发条件: 当Eden空间满时触发Minor GC。

  • 回收过程:

    • 首先,垃圾回收器标记并清理Eden空间中不再被引用的对象。
    • 存活的对象会被移到Survivor空间,如果Survivor空间满,将会晋升到老年代。
    • 清理后,Eden空间变为新的工作区域,等待下一次的对象分配。
  • 特点:

    • Minor GC的速度较快,因为它只需要清理新生代,而且很多对象在新生代很快被回收。
2. Full GC
  • 触发条件: 在老年代空间不足时触发Full GC。或者是由于Minor GC过程中晋升到老年代的平均大小大于老年代的剩余空间时。

  • 回收过程:

    • Full GC会对整个堆进行清理,包括新生代和老年代。
    • 它会停止应用程序的所有线程,进行垃圾回收,因此 Full GC 的耗时较长。
    • 对象的引用关系被重新整理,不再被引用的对象所回收。
  • 特点:

    • Full GC对整个堆进行回收,包括新生代和老年代,速度较慢。
总结

新生代的垃圾回收主要通过Minor GC来清理Eden空间和Survivor空间,快速回收短时间内创建的对象。而Full GC则是针对整个堆内存进行的,较为耗时。这种分代垃圾回收的策略有效提高了垃圾回收的效率,延长了老年代的垃圾回收触发时间,提高了整体的应用程序性能。

什么是老年代空间分配担保机制

  1. 老年代空间分配担保机制是Java虚拟机为了避免由于新生代Minor GC导致的空间不足而触发一次Full GC,从而提高垃圾回收效率的一种机制。具体而言,它保证了在发生Minor GC时,虚拟机在老年代预留一定的内存空间,以应对新生代对象晋升到老年代的情况。

  2. 这个机制的设计基于这样一个考虑:在一次Minor GC之前,虚拟机会首先检查老年代的剩余空间是否大于新生代所有对象的总空间,如果是,那么Minor GC可以放心进行。如果不足以容纳新生代所有对象,那么虚拟机会查看老年代中的存活对象是否能够在某个特定的年龄阈值之下就能被全部安置到老年代,如果这个条件成立,同样触发Minor GC,否则,进行一次Full GC。

  3. 这个担保机制的核心思想是为了尽量避免因为新生代对象晋升导致的Full GC。因为Minor GC的频率通常比Full GC低得多,而且Minor GC的速度更快,因此通过老年代空间分配担保机制,可以在大多数情况下避免因为新生代GC而触发Full GC,提高了垃圾回收的效率。
    在这里插入图片描述

什么情况下对象会进入老年代?

躲过 15 次 GC之后进入老年代,可通过JVM 参数“-XX:MaxTenuringThreshold”来设 置年龄,默认为 15 岁
2、动态对象年龄判断
3、老年代空间担保机制
4、大对象直接进入老年代

  • 大对象是指需要大量连续内存空间的 Java 对象,比如很长的字符串或者是很大的数组或者List 集合,大对象在分配空间时,容易导致内存明明还有不少空间时就提前触发垃圾回收以获得足够的连续空间来存放它们,而当复制对象时,大对象又会引起高额的内存复制开销,为了避免新生代里出现那些大对象,然后屡次躲过 GC 而进行来回复制,此时JVM 就直接把该大对象放入老年代,而不会经过新生代;
  • 我们可以通过JVM 参数“-XX:PretenureSizeThreshold”设置多大的对象直接进入老年代,该值为字节数,比如“1048576”字节就是 1MB,该参数表示如果创建一个大于这个大小的对象,比如一个超大的数组或者 List 集合,此时就直接把该大对象放入老年代,而不会经过新生代-XX:PretenureSizeThreshold 参数只对 Serial 和 ParNew 两款新生代收集器有效,其他新生代垃圾收售器不支持该参数,如果必须使用此参数讲行调优,可考虑 ParNew+CMS 的收集器组合。

JVM 运行时数据区 元空间的特点及作用?

  • 1、在JDK1.8 开始才出现元空间的概念,之前叫方法区/永久代
  • 2、元空间与 Java 堆类似,是线程共享的内存区域
  • 3、存储被加载的类信息、常量、静态变量、常量池、即时编译后的代码等数据
  • 4、元空间采用的是本地内存,本地内存有多少剩余空间,它就能扩展到多大空间,也可以设置元空间大小;
    -XX:MetaspaceSize=20M -XX:MaxMetaspaceSize=20m
  • 5、元空间很少有 GC 垃圾收集,一般该区域回收条件苛刻,能回收的信息比较少,所以 GC很少来回收

结语:

在Java中,垃圾回收是一项重要的技术,通过自动管理内存资源,使得开发者可以更专注于业务逻辑的实现而不用过多关心内存的分配和释放。通过深入理解垃圾回收机制,我们可以更好地优化代码,提高程序性能,确保系统的稳定性和可维护性。

感谢您的阅读,希望本文对您理解和应用Java中的垃圾回收机制有所帮助。如果有任何疑问或建议,欢迎留言交流,共同学习进步。谢谢!

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【深度学习:Foundation Models】基础模型完整指南

【深度学习:Foundation Models】基础模型完整指南 什么是基础模型?基础模型背后的 5 项人工智能原理根据大量数据进行预训练自我监督学习过度拟合微调和快速工程(适应性强)广义的 基础模型的用例基础模型的类型计算机视觉基础模型…

【手搓深度学习算法】用逻辑回归分类双月牙数据集-非线性数据篇

用逻辑回归分类-非线性数据篇 前言 逻辑斯蒂回归是一种广泛使用的分类方法,它是基于条件概率密度函数的最大似然估计的。它的主要思想是将输入空间划分为多个子空间,每个子空间对应一个类别。在每个子空间内部,我们假设输入变量的取值与类别…

大创项目推荐 深度学习实现语义分割算法系统 - 机器视觉

文章目录 1 前言2 概念介绍2.1 什么是图像语义分割 3 条件随机场的深度学习模型3\. 1 多尺度特征融合 4 语义分割开发过程4.1 建立4.2 下载CamVid数据集4.3 加载CamVid图像4.4 加载CamVid像素标签图像 5 PyTorch 实现语义分割5.1 数据集准备5.2 训练基准模型5.3 损失函数5.4 归…

大数据毕业设计:图书推荐系统+可视化+Django框架 图书管理系统 (附源码+论文)✅

毕业设计:2023-2024年计算机专业毕业设计选题汇总(建议收藏) 毕业设计:2023-2024年最新最全计算机专业毕设选题推荐汇总 🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题&#xff…

2024年动画云渲染,渲染农场使用图文步骤

“云渲染”、“渲染农场”在做三维动画的公司以及个人都非常的清楚,这些主要是提升用户的渲染速度,由于动画公司通常制作的时间比较长,在渲染时本地电脑往往满足不了渲染需求。今天以动画云渲染农场,看看渲染农场怎么使用的吧&…

m1 + swoole(hyperf) + yasd + phpstorm 安装和debug

参考文档 Mac M1安装报错 checking for boost... configure: error: lib boost not found. Try: install boost library Issue #89 swoole/yasd GitHub 1.安装boost库 brew install boostbrew link boost 2.下载yasd git clone https://github.com/swoole/yasd.git 3.编…

太实用了!关于ControlNet,这篇你一定要看

一篇文章教会你,从入门到使用。 这里是行者AI,我们专注于人工智能在游戏领域的研究和应用,凭借自研算法,推出游戏AI、智能内容审核、数据平台等产品服务。 controlNet控制生成 anypaint 看到这篇文章的你,一定也是AI绘…

stm32的规则采样与注入采样的理解

规则与注入转换 在STM32中,规则采样(Regular Conversion)和注入采样(Injected Conversion)是用于模数转换的两种不同模式。 规则采样(Regular Conversion):规则采样是STM32中最常用…

分布式(9)

目录 41.常见的JOB实现方案? 42.Cookie和Session有什么区别? 43.谈谈会话技术的发展? 44.分布式会话有哪些解决方案? 45.什么是Session Stick? 41.常见的JOB实现方案? 基于上面Java任务演化出分布式J…

Mendeley Word 文献引用

这里写目录标题 1. 下载Mendeley 并插入到Word1.1 下载安装1.2 在Word 中添加Mendeley 插件文献引用相关 1. 下载Mendeley 并插入到Word 1.1 下载安装 Mendeley 官网下载 1.2 在Word 中添加Mendeley 插件 打开 Mendeley,点击 Tools —>Install Mendeley Cite…

Python学习笔记-使用Anaconda+VSCode配置开发环境

文章目录 概述一、安装Anaconda1.1 下载软件1.2 安装anaconda1.3 配置环境 二、配置虚拟环境2.1 使用conda创建一个新的虚拟环境2.1.1 使用search指令查看支持的python的版本:2.1.2 使用create创建指定版本的虚拟环境:2.1.3 使用env list查看虚拟环境列表…

面试宝典进阶之redis缓存面试题

R1、【初级】Redis常用的数据类型有哪些? (1)String(字符串) (2)Hash(哈希) (3)List(列表) (4)Se…