JVM笔记(4)—— 运行时数据区——堆空间

news2025/1/10 17:09:42

一、堆空间内存结构

堆空间内存分为年轻代和老年代。年轻代又细分为Eden区,Survivor1区和Survivor2区(又称为from区和to区)
在这里插入图片描述

为什么要对堆空间进行分代?
因为不同对象的生命周期不同,绝大部分对象都是临时对象,如果不进行分代设计,那每次GC都要对所有对象进行扫描,影响GC性能,通过分代设计,大部分时候GC只需要对其中一块空间进行垃圾回收,优化了整体性能。

1. 对象在堆中的生命周期

(1)new的对象先放在Eden区。
(2)当Eden区满,而程序又需要创建新的对象时,JVM垃圾回收器首先对Eden区进行垃圾回收(Young/Minor GC),将Eden区中不被引用的对象进行销毁,然后将Eden区剩余的所有对象转移到S0区。再将新的对象放到Eden区。
(3)当再次触发Young GC时,在Eden区和S0区中进行回收,之前就在S0区且此次没有被回收的对象会被转移到S1区,Eden中存活的对象也会转移到S1区。
(4)当再次触发Young GC时,S1区中没有被回收的对象又会被转移到S0区,Eden中存活的对象也会转移到S0区(也就是说一个时刻S0区和S1区中只有一个区中有对象,这个区也被称为from区,另一个区则为to区,to区就是下一次垃圾回收时幸存对象要进入的区)
(5)当一个对象经历多次(默认为15次,可通过-XX:MaxTenuringThreshold参数进行设置)垃圾回收仍然幸存,则会被转移到老年区。

这个过程中还会有一些特殊情况:
(1)Young GC后若S区放不下幸存的对象,则部分对象直接晋升老年代。
(2)若Young GC后Eden区还是放不下要创建的对象(超大对象),则尝试直接将其放到老年代,若老年代放不下,则触发Full GC(对整个堆和方法区进行垃圾回收),若Full GC后老年代还是放不下,则抛出OOM错误。
在这里插入图片描述

垃圾回收会引发STW,会先暂停其他用户线程,等垃圾回收结束,用户线程才恢复运行。Full GC比Young GC要慢很多,STW暂停时间在十倍以上,因此在开发和调优中要尽量避免Full GC。

2. 堆中各个区大小参数设置

-XX:NewRatio 设置年轻代和老年代空间大小比例。默认值为2:1
-XX:SurvivorRatio 设置年轻代中Eden区和survivor区大小比例。默认大概为8:1:1,根据实际自适应

3. GC分类

在这里插入图片描述

二、堆空间大小的设置与查看

1. 默认堆空间的大小

  • 初始内存大小:系统物理内存大小 / 64
  • 最大内存大小:系统物理内存大小 / 4

2. 通过运行参数设置堆空间大小

  • -Xms 用于设置堆空间初始内存大小,例:-Xms200M
  • -Xmx 用于设置堆空间最大内存大小,例:-Xmx200M

通常会将-Xms和-Xmx设置为相同的值,其目的是为了能够在垃圾回收清理完堆区后不需要重新分隔计算堆区的大小,以提高性能。

3. 在代码中查看堆空间大小

但这样计算出来的数会比堆空间实际分配的内存要小些,因为S区同一时刻只占用一个,这里计算就只计算了一个S区
在这里插入图片描述

4. 在命令行中查看jvm进程的堆空间大小

使用jstat命令

jstat -gc 进程id

C代表总大小,U代表已使用大小
在这里插入图片描述

5. 使用可视化工具jvisualvm查看

在命令行输入jvisualvm命令(jdk自带可视化工具),打开jvisualvm可视化界面,安装Visual GC插件,即可查看jvm进程实时内存情况
在这里插入图片描述

三、线程私有缓存区域 TLAB

在Eden空间中,JVM为每个线程分配了一个私有缓存区域(TLAB,Thread Local Allocation Buffer)。使用TLAB可以避免一系列线程安全问题,并且由于无需对地址空间加锁,提升了内存分配速率。我们将这个内存分配方式称为快速内存分配策略

在这里插入图片描述

每个线程使用堆空间时优先使用TLAB空间,用完了或者不够用才使用公共的Eden空间
在这里插入图片描述
默认情况下,TLAB所占的空间非常小,仅占用整个Eden空间的1%。也可以通过选项-XX:TLABWasteTargetPercent设置TLAB空间所占Eden空间比例大小。

四、堆空间常用参数小结

在这里插入图片描述

五、堆是分配对象存储的唯一选择吗?代码优化技巧

在这里插入图片描述
jdk 6u23版本之后,Hotspot JVM就默认开启了逃逸分析。之前的版本可通过-XX:+DoEscapeAnalysis选项显示开启。

通过逃逸分析有如下代码优化技巧

1. 栈上分配

JIT即时编译器在编译期间根据逃逸分析的结果,发现如果一个对象没有逃逸出方法的话,就可以被优化成栈上分配。分配完成后,继续在调用栈内执行,最后线程结束,栈空间被回收,局部变量对象也被回收。这样就能降低对堆空间的占用并且无需进行垃圾回收了。因此,在开发中能使用局部变量时,就不要定义在方法之外。

2. 同步省略

在这里插入图片描述

3. 标量替换

在这里插入图片描述
参数-XX:+EniminateAllocations开启标量替换(默认是开启的),允许将对象打散分配在栈上。

主要还是通过标量替换实现的栈上分配,Hotspot没有直接实现栈上分配。

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

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

相关文章

DIY 3D打印机——【有啥用啥版】

3D打印已经非常普及,手搓3D打印机的也很普遍了,不幸的是多年前买的三角洲(delta型)打印机年前罢工了,幸好它完成了一项重要使命:让手搓的铣床动起来,从而能够让铣床把受力部分的PLA零件自己加工…

高频卡顿问题分析

从监控图中可以看到,3.76k的用户,两分钟内报卡顿次数达到100万次 ,很恐怖,这个是非正常的卡顿 由于没有日志,只能先看代码分析,出现高频卡顿的原因 问题描述 在播放过程,会频繁上报卡顿&…

Redis详解(二)

文章目录Redis的单线程模型Redis数据过期删除策略内存淘汰机制手写LRU持久化快照持久化(RDB)RDB优缺点AOF持久化AOF优缺点RDB和AOF的选择注意事项Redis修改配置后未生效(windows)Redis的单线程模型 Redis基于Reactor模式来设计开发了自己的一套高效的时间处理模型。 Redis内部…

leetcode-每日一题-1669-合并两个链表(中等,链表操作)

这道题就是考察对链表的理解,但是题目给的链表和我们数据结构学的还是有点不一样的,这里面的头节点是带节点信息的,我们按照课本来说的话头节点,或者叫首元节点如果我记得不错的话就是叫这个,是不提供节点信息的&#…

[数字媒体] PR视频剪辑之自定义音频、视频加速转场和特显停顿

这篇博客是作者数字媒体系列的笔记,仅作为在线笔记供大家学习。在剪辑视频中,我们会遇到自定义音频、视频加速转场、特显停顿、画面调整等技巧,这篇文章将详细介绍。希望对您有所帮助,后续有时间会深入分享视频制作、动画制作等内…

结合淘宝与Twitter详解分布式系统与其架构设计,分布式其实并不难,阿里架构师用实战给讲明白了!

什么是分布式架构 分布式系统(distributed system) 是建立在网络之上的软件系统。 内聚性:是指每一个数据库分布节点高度自治,有本地的数据库管理系统。 透明性:是指每一个数据库分布节点对用户的应用来说都是透明的…

手把手教你如何从0到1开发自动化测试框架,你确定不看?

目录 一、序言 二、自动化测试框架技术选型 三、自动化测试框架的设计思路 四、自动化框架介绍 五、框架技术要点解析 六、后续TODO 一、序言 随着项目版本的快速迭代、APP测试有以下几个特点: 首先,功能点多且细,测试工作量大&#x…

Redis基本通用命令

通用命令 查看使用文档,例如要查看select怎么使用 help select切换数据库 select 1查看符合模板的所有key keys * keys *a keys a*判断key是否存在 exists k1给key设置有效期,给k1设置20秒有效期 expire k1 20查看key剩余有效期,查看k1…

2014年408算法题

文章目录0 结果1 题目2 思路0 结果 1 题目 2 思路 二叉树的带权路径长度(WPL)的计算方法有两种: 1,定义:WPL所有叶结点的权值Wi∗该结点深度Di求和WPL所有叶结点的权值W_i*该结点深度D_i求和WPL所有叶结点的权值Wi​…

linux环境minio安装启动,管理员登录,nginx代理

一.下载minio 官网下载: MinIO | Code and downloads to create high performance object storage 直接点击下载或者用wget https://dl.min.io/server/minio/release/linux-amd64/minio 最后都是得到一个文件minio(大概100M) 二.启动minio 1.创建文件夹,比如 mkdir /data…

mysql的redolog、undolog、binlog介绍,及mysql两阶段提交

https://blog.csdn.net/weixin_45676738/article/details/124770085 https://blog.csdn.net/TABE_/article/details/124935324 三种log REDO LOG 称为 重做日志 ,提供再写入操作,恢复提交事务修改的页操作,用来保证事务的持久性。 UNDO LOG 称…

电源管理系统的功能和发展前景分析

电源对于电子设备的重要性不言而喻,电源管理系统是将电源有效分配给系统中的不同组成,在电子设备中起到了电能变换、控制、检测等作用,保证系统的稳定运行,对设备的性能有着直接影响,广泛用在工业、新能源、机器设备、…

一、初识 Spring 框架

文章目录一、Spring 简介二、Spring 框架的优点三、Spring 框架的组成四、Spring 框架 学习路线一、Spring 简介 Spring 框架简介 2004年3月24日发布了Spring 1.0正式版,Spring 框架的诞生给整个软件行业带来了春天。这个框架极大程度上简化了开发,其本…

基于无人机和背负式激光雷达点云的黄河三角洲刺槐林地上生物量估算

论文标题:Estimation of aboveground biomass of Robinia pseudoacacia forest in the Yellow River Delta based on UAV and Backpack LiDAR point clouds ABSTRACT 人工林是陆地碳汇的重要来源。黄河三角洲刺槐林是我国最大的人工生态防护林。然而,自…

“深度学习”学习日记。与学习有关的技巧--超参数的验证

2023.1.31 超参数是指神经网络中,神经元的数量、batch的大小、参数更新时的学习率或权值衰减等,虽然超参数的取值非常重要,但是决定超参数的值时会伴随很多人工的试错,所以我们需要高效地寻找超参数的值的方法 一,验…

【4】【Spring】,【Ioc/DI】,【IoC容器】,【Bean】

1、Ioc/DI,IoC容器,Bean 为了解决不同实现方式耦合度高 Ioc:(Inversion of Control)控制反转 主要思想:使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移…

vite打包静态文件打开显示空白

vite 打包生成静态文件打开显示空白 需求场景 本地调试访问打包的文件看是否有啥问题,方便定位线上问题安卓手机需要去直接访问静态文件,而不是访问域名的情况 vite 打包生成的文件如果直接放在服务器中是可以正常访问的,但是本地直接访问…

三个方面使CRM在360度客户视图中受益

360度客户视图这个词相信您不会陌生,很多关于CRM客户管理系统的文章中都有所提及。所谓的360度客户视图,是帮助企业和业务人员建立客户认知,消除客户生命周期中的信息脱节,让业务人员为客户提供一致性的体验。接下来我们们说&…

Windows10神州网信版的安装

在大约20天里面我完成了Windows10神州网信版72台的安装,有些2009~2014年的计算机完成安装后做一般的办公应用也能流畅运行。买一台新的计算机至少要好几千,通过更换固态硬盘和内存条可以达到旧物新用的目的。 一、安装过程   1、检查硬件  …

Coggle 30 Days of ML(23年1月)打卡

前言 任务链接 这个任务内容比较感兴趣而且和工作内容相关,学习一下打个卡。 编码完成任务1,2,3,5,6,目前手上只有2080,之后在3090上跑。 最近杂事多,笔记、任务4和7之后再补充。 …