JVMGC复习

news2024/9/24 10:30:14

TLAB:默认给每一个线程开辟一块内存空间存放线程自己的对象

Class对象是存放在堆区的,不是方法区,类的元数据元数据并不是类的Class对象,Class对象是加载的最终产品,类的方法代码,变量名,方法名,访问权限,返回值等等都是在方法区的,代码信息只是在方法区;

对齐填充:方便计算机寻址存取方便,是计算机寻址最优的一种方式

压缩前:一开始String和Object都是占用的是8个字节,这些对象地址放到堆里面,开启某一个参数以后可以让对应的对象的内存地址压缩到四个字节

压缩以后:

init方法:成员变量真正进行赋值,之前是0,并且调用对象的构造方法

标量替换:对于一个对象来说,如果采取栈上分配,不会new一个对象在栈上面,而是将它的成员变量属性剥离开存放分配在栈上,分开存,这几个字段会进行标识是属于哪一个对象的,前提是开启了逃逸分析;

1)大对象直接放到老年代:可以设置参数

如果你知道系统创建的对象比较大,况且这些对象不会被垃圾收集的,Serial+ParNew有效JVM会直接判断对象大小,就是为了降低大对象分配内存的时候复制对象而降低效率

2)达到分代年龄存放到老年代:可以设置参数

大概知道很多new对象生命周期不是特别长,可能要用一段时间,没有执行时间特别长的方法,或者其他的情况程序员大概可以估算到一个方法中有一个大对象,但是方法结束非常快,可能一两次GC就被干掉,分代年龄尽量设置的少一些,可以尽快节省新生代的空间

3)对象动态年龄判断机制:

对于订单系统来说,每秒钟有60M对象会向伊甸园区里面存放,1S以后变成垃圾对象

当前放对象的Survior区域里面(其中一块区域,放对象的那一块S区),一批对象的总大小大于这块Survior区域的50%(-XX:TargetSurivorRatio可以指定),那么此时大于等于这一批年龄对象的最大值的对象,就可以直接存放到老年代了,假设现在幸存者区里面有一批对象,年龄1+年龄2+年龄N的多个年龄对象超过了Surivor区域的50%,此时就会把年龄N以上的对象全部放在老年代,这个规则是希望那些可能长期存活的对象尽早地进入到老年代,对象年龄判断机制其实是在minor GC以后触发的;

1)大概13秒或者14s来说伊甸园区就会被放满,会触发minorGC,会把伊甸区的对象全部进行垃圾回收,前面13s的对象做minor GC的时候都是可以回收掉的,但是伊甸区第14s产生的对象会触发minorGC,因为此时订单正在执行过程中,14s产生的对象都被GCROOTS引用着,所以此时这60M对象会被存放到S0区域,但是前面13s产生的对象会被伊甸园区直接被干掉,因为之前伊甸区的方法已经结束了,生成订单非常快;

2)但是最终情况是:这60M对象会被分配到老年代,每隔14s有60M对象放到老年代,等到一段时间5 6min就会发生FullGC,但是其实这些对象其实早就变成垃圾了,因为正常的订单对象早就变成垃圾了1S终究欸有引用指向它,这种情况不太好;

3)这个时候朝生夕死的对象太多,于是就适当提高年轻代的空间大小,频繁导致FullGC的原因就是动态年龄判断机制,使用两种机制来优化,一种是调整surivor区域,一种是把年轻代调整的大一些,几乎不发生FullGC;

适当提升新生代的比例之后:第24s以后对象的空间已经满了,那么此时这个25S产生的60M对象会直接存放到幸存区,此时触发minorGC会进行回收伊甸园区和幸存者区,增大新生代;

4)老年代动态分配担保机制:当JVM在做minor GC之前,如果大概率先做FullGC,再来做minorGC,那么这个minorGC非常快时间非常短,如果你不做这个判断,做完minorGC之后再来做fullGC,那minor GC耗费的时间比较多,FullGC耗费的时间也会很多;

1)JVM会进行判断老年代剩余有效的空间如果小于年轻代所有对象(包含垃圾对象)的空间,如果老年代不能容纳下来新生代的所有对象假设说如果新生代的所有的对象直接挪到老年代了,放不了就会直接出发fullGC,然后JVM会判断一个参数;

2)如果老年代能容纳下来新生代的所有对象(大于等于),那么直接进行minor GC

3)此时如果你设置了这个参数,那么直接会进行判断老年代可用空间是否小于历史上每一次minor GC之后进入到老年代的对象的平均大小,假设每一次minor GC,第一次挪了50M,第二次挪了60M,第三次挪了100M,那么JVM会计算这三次挪到老年代的平均内存大小,(50+50+100)/3,如果大于,肯定会做FUllGC,再做minorGC;

4)如果小于那么直接做minor Gc;

5)如果没有设置参数,直接做fullGC;

如果调整完新生代的大小之后将晋升到老年代的空间调整成5了,因为这种情况是每25S触发一次minorGC,触发一次GC,分代年龄+1,分代年龄达到5,说明已经过去了好几分钟了,所以说这些已经达到5的对象早就已经变成垃圾了,要么赶紧被清理掉,如果分代年龄达到5,说明这样的对象肯定不是简单的GC对象肯定不容易被收集,这样的对象肯定是系统中的缓存对象Spring Bean对象,线程池的引用对象,对于这些对象可以让她尽量的早点老年代,不要再年轻代里面占用过多的那些朝生夕死的对象的空间了,订单对象库存对象,优惠劵对象的空间了,让那些年轻代的对象能够在年轻代就被干掉

使用G1垃圾回收器,内部算法耗费的性能比CMS要高

CMS触发FullGC比例可能会导致部分空间不可用,如果FullGC发生频率很低,这时就可以启动serial Old来进行清理,设置参数是0,每一次FullGC,serial Old会清理一次内存碎片,但是如果出现秒杀活动,就尽量减少内存碎片的整理,因为不敢让用户线程停止,这时候就可以配置5次FullGC一次清理,如果长时间不做内存清理,那么老年代的连续可用内存空间会越来越少;

 

fullGC回收类元信息和堆空间

没有类原信息,对象的对象头已经没有指针指向这个类原信息,但是这三种类加载器不会被回收,所以加载的类不会被回收;

所有的classLoader都会记录着所有它加载过的类信息

Class对象是可以创建出对象

 内存泄漏篇:

常见工具的使用:
1)jps 

 
2)jstat

jstat -class +进程的端口号,类的加载数,占据的总体字节数,卸载数,占用的总体时间

jstat -class +进程的端口号+每隔多少毫秒打印一次,下面的这种情况默认是1000ms打印一次直至程序终止

jstat监视虚拟空间的占用和垃圾回收的行为

jstart -class -t +进程的ID

jstat -gc +进程的PID

jstat -gccause+ID,进行查看gc的原因

能够计算出这两段区间内gc的执行时间,后面GC的间隔时间/程序间隔运行时间,可以看出垃圾回收时间占总共程序运行时间的比例

隔一段时间找一个最小值,隔一段时间找一个最小值

3)

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

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

相关文章

解决windows中被占端口问题(实测有效)

1、用管理员身份打开cmd 2、输入命令查找所被占的端口号 例:8902 netstat -ano | findstr 8902终结被占端口号的进程 例:端口号为8080,则查找到的pid为18524 taskkill /t /f /pid 18524强制(/F参数) 子进程&#x…

小公司如何成功申请企业邮箱

对于小公司来说拥有专业的企业邮箱不仅有助于提升公司形象,还能有效提高工作效率。小公司怎么申请企业邮箱?以下是一些步骤和建议供您参考。 需要明确公司的需求。 这包括确定所需用户账户的数量(一般是目前使用人数再加上几个备用的邮箱&…

Docker入门到精通教程

Docker是什么 Docker是一个开源的应用容器引擎,它基于Go语言并遵从Apache2.0协议开源。容器技术是和我们的宿主机共享硬件资源及操作系统,实现资源的动态分配,在资源受到隔离的进程中运行应用程序及其依赖关系。 Docker可帮助更快地打包、测…

Redis实现附近商户

GEO数据结构的基本用法 GEO就是Geolocation的简写形式,代表地理坐标。Redis在3.2版本中加入了对GEO的支持,允许存储地理坐标信息,帮助我们根据经纬度来检索数据。常见的命令有: GEOADD:添加一个地理空间信息&#xf…

【广州华锐互动】VR石油钻井井控实训系统

在过去的几十年中,石油工业的发展速度一直在加快。为了适应这个快速发展的行业,需要新的技术和工具,而VR(虚拟现实)技术正是其中之一。本文将探讨VR石油钻井井控实训系统在石油工业教育中的应用。 在真实的钻井环境中&…

接口管理神器Apipost

自诞生以来,Apipost凭借其简洁直观的用户界面、强大的功能以及简单、易上手的操作,让Apipost成为了开发人员不可或缺的工具。本文将详细介绍Apipost的主要功能和使用方法,帮助大家更好地了解这款优秀的API开发工具。 下载安装 直接进入Apip…

Stable Diffusion WebUI扩展a1111-sd-webui-tagcomplete之Booru风格Tag自动补全功能详细介绍

安装地址 直接附上地址先: Ranting8323 / A1111 Sd Webui Tagcomplete GitCodeGitCode——开源代码托管平台,独立第三方开源社区,Git/Github/Gitlabhttps://gitcode.net/ranting8323/a1111-sd-webui-tagcomplete.git上面是GitCode的地址,下面是GitHub的地址,根据自身情…

个人微信CRM客户管理系统怎么选?功能介绍

现在市面上有许多种类的个人微信CRM客户管理系统可供选择,因此,我们需要选择最适合自己需求的微信管理系统CRM,最重要的是根据您的需求和期望的功能来进行筛选。 如何选择适合自己的微信CRM客户管理系统? 现在市面上的系统五花八…

Cloud Studio连接MySQL,Access denied for一系列问题

官方文档有写如何安装Mysql $ apt update $ apt install mysql-server mysql-client -y$ service mysql start mysql -uroot -p123456进入MySQL命令行 问题出在连接数据库这一步,命令行能进去,但是数据库插件和代码都连不上 Access denied for 大概率…

基于SSM的外卖点餐系统设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue、HTML 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是…

python实现列表倒叙打印

嗨喽,大家好呀~这里是爱看美女的茜茜呐 def func(listNode):listNode.reverse()for i in listNode:print(i)li [1,2,3,4,5] func(li)利用python列表函数reverse()将列表倒叙,然后遍历打印,但是这有一个缺点就是改变了…

固态硬盘的日常注意事项

固态硬盘是一种高速、低功耗、无噪音、抗震动的存储设备,但是在使用过程中也需要注意以下几点: 避免频繁重复写入同一块区域,这会缩短固态硬盘的使用寿命。定期清理垃圾文件和临时文件,以免占用过多的存储空间。避免在固态硬盘上…

RISC-V架构——物理内存属性和物理内存保护

1、物理内存属性(PMA:Physical Memory Attributes) (1)系统内存映射包含各种不同属性的地址空间范围,每个地址空间范围支持的操作不一样; (2)物理内存属性一般是在芯片设…

使用IDEA2022.1创建Maven工程出现卡死问题

使用IDEA创建Maven工程出现卡死问题,这个是一个bug 这里是别人和官方提供这个bug,大家可以参考一下 话不多说,上教程 解决方案: 方案1:更新idea版本 方案2:关闭工程,再新建,看图

开源设计和原型平台 Penpot:跨领域团队的愉快体验 | 开源日报 No.59

penpot/penpot Stars: 23.8k License: MPL-2.0 Penpot 是第一个面向跨领域团队的开源设计和原型平台。它不依赖于操作系统,基于 Web,并使用开放标准 (SVG)。 为跨领域团队而生:专注于设计和代码团队,提供无需频繁交接工作的愉快…

数字图像处理实验记录三(双线性插值和最邻近插值)

前言:个人实验记录,仅供学习参考,实验报告别用我图 文章目录 一、基础知识1,为什么要进行插值:2,双线性插值原理:3,最邻近插值: 二、实验要求:1.…

215. 破译密码 - mobius函数 + 整数分块

215. 破译密码 - AcWing题库 mobius函数: 一个数的分解质因数形式,某一个指数>1为0,质因数为奇数个为-1,偶数个为1 mobius函数可以与容斥结合起来,比如mobius[2] -1, mobius[3] -1, mobius[2 * 3] 1。对应容斥…

硬件系统工程师宝典(44)-----差分信号走线“相位失配”怎么破?

各位同学大家好,欢迎继续做客电子工程学习圈,今天我们继续来讲这本书,硬件系统工程师宝典。 上篇我们说到了PCB在布局时除了要满足结构需求,还要考虑模块划分、特殊器件的布局以及散热问题。今天来说说高速PCB布线的一些注意事项…

2023服务端测试开发必备技能:Mock测试

什么是mock测试 Mock 测试就是在测试活动中,对于某些不容易构造或者不容易获取的数据/场景,用一个Mock对象来创建以便测试的测试方法。 Mock测试常见场景 无法控制第三方系统接口的返回,返回的数据不满足要求依赖的接口还未开发完成&#…

【Docker】Docker里面安装win系统

前端时间还早想着在win上面安装DokerDesktop,处理暂用【Docker】Docker Desktop更换非C盘符(减轻占用率),这次心想可否反过来呢?就是想在:Docker里面安装win系统 docker pull microsoft/windowsservercoredocker create --name …