JVMGC复习

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.mzph.cn/news/112676.shtml

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

相关文章

【黑马程序员】机器学习

(一)机器学习概述 一、机器学习算法分类 1、监督学习: (1)目标值是类别:分类问题 k-近邻算法、贝叶斯分类、决策树与随机森林、逻辑回归 (2)目标值是连续型的数据:回归…

微信小程序进阶——后台交互

目录 一、后台准备 1.1 pom.xml 1.2 配置数据源 1.3 整合mybatis 二、前后端交互 2.1 method1 2.2 method2 2.2.1 封装request 2.2.2 头部引用util 2.2.3 编写方法 2.2.4 展示效果 三、WXS的使用 3.1 会议状态 3.1.2 引入wxs 3.1.3 修改代码 3.1.4 展示效果 3…

【python】进程和线程

进程和线程 今天我们使用的计算机早已进入多CPU或多核时代,而我们使用的操作系统都是支持“多任务”的操作系统,这使得我们可以同时运行多个程序,也可以将一个程序分解为若干个相对独立的子任务,让多个子任务并发的执行&#xff…

关于 Invalid bound statement (not found): 错误的解决

关于 Invalid bound statement not found: 错误的解决 前言错误原因解决方法1. 检查SQL映射文件2. 检查MyBatis配置3. 检查SQL语句4. 检查命名约定5. 清除缓存6. 启用日志记录 重点注意 结语 我是将军我一直都在,。! 前言 当开发Java Spring Boot应用程…

自然语言处理基础

自然语言 自然语言处理是人工智能能够通过图灵测试的重要工具。 自然语言处理基本的任务和应用 词性标注:把每句话的各个单词的词性标注出来,例如:形容词、名词、动词 named entity recognition命名实体的识别:识别哪些单词是真…

Service Mesh和Kubernetes:加强微服务的通信与安全性

文章目录 什么是Service Mesh?Service Mesh的优势1. 流量控制2. 安全性3. 可观测性 Istio:Service Mesh的领军者流量管理安全性可观测性 Linkerd:轻量级Service Mesh流量管理安全性可观测性 Istio vs. Linkerd实际应用结论 🎈个人…

小度打头阵,百度大模型能否“赋能万物”?

文 | 智能相对论 作者 | 楷楷 近日,百度集团副总裁、小度科技原CEO景鲲因个人原因辞任,百度集团副总裁、首席信息官(CIO)李莹轮岗出任小度科技CEO,并向李彦宏直接汇报。 随着“景鲲时代”落幕,新任CEO李…

2023年中国档案信息化发展历程、竞争格局及行业市场规模分析[图]

档案信息化是以网络、计算机、信息技术为手段,以档案资源为对象,以档案工作为依托,以档案管理学最新理论为指导,按照信息社会和国家档案行政管理部门的要求、开展档案的收集、整理、保管、开发和利用的现代化管理过程。 档案信息化…

[SQL开发笔记]INSERT INTO 语句:将新记录插入到数据库表中

目前,向数据库插入数据是数据管理的重要环节,它可以将数据长期保存、共享访问、保证数据的完整性和安全性,同时也是进行数据检索和分析的基础。其中,INSERT INTO 语句是SQL(结构化查询语言)中用于向数据库表…

使用guacamole进行WEB远程桌面连接

Apache Guacamole 是一个无客户端的远程桌面网关。它支持标准协议,如 VNC、RDP 和 SSH,甚至还支持k8s、telnet连接。它可以在任何有网络的地方连接上你的服务器和Windows主机。可以同时连接多个终端,并且能够无缝切换。本文采用docker进行部署…

数据结构与算法(十):动态规划与贪心算法

参考引用 Hello 算法 Github:hello-algo 1. 动态规划算法 动态规划将一个问题分解为一系列更小的子问题,并通过存储子问题的解来避免重复计算,从而大幅提升时间效率 问题:给定一个共有 n 阶的楼梯,你每步可以上 1 阶或…

【王道代码】【2.3链表】d1

关键字: 递归删除x;删除所有x;递归反向输出;删除最小结点(2组指针);原地逆置;使递增有序

2008-2021年上市公司实体企业金融化程度测算数据(原始数据+stata代码)

2008-2021年上市公司实体企业金融化程度测算(原始数据stata代码) 1、时间:2008-2021年 2、指标:股票代码、年份、交易性金融资产、衍生金融资产、发放贷款及垫款净额、可供出售金融资产净额、持有至到期投资净额、长期债权投资净…

github 终端克隆操作,以及对 https/ssh 的理解

前言 最近瞎搞 github 的一些配置,结果搞得有一段时间克隆不了仓库。不过经历了这次风波后,我对 github 的一些原理有了更清楚的了解。所以想稍微写一小篇文章总结输出一下,也欢迎有疑问的读者与博主进一步交流,我的理解还是有限…

[1Panel]开源,现代化,新一代的 Linux 服务器运维管理面板

测评介绍 本期测评试用一下1Panel这款面板。1Panel是国内飞致云旗下开源产品。整个界面简洁清爽,后端使用GO开发,前端使用VUE的Element-Plus作为UI框架,整个面板的管理都是基于docker的,想法很先进。官方还提供了视频的使用教程&…

leetcode:2678. 老人的数目(python3解法)

难度:简单 给你一个下标从 0 开始的字符串 details 。details 中每个元素都是一位乘客的信息,信息用长度为 15 的字符串表示,表示方式如下: 前十个字符是乘客的手机号码。接下来的一个字符是乘客的性别。接下来两个字符是乘客的年…

leetcode:217. 存在重复元素(先排序再比较邻位)

一、题目: 函数原型: bool containsDuplicate(int* nums, int numsSize) 参数分析: nums是传入的数组 numsSize是传入数组的元素个数 二、思路: 根据题意,判断数组中是否存在出现两次以上的元素。可以先将数组排序&…

基于混沌博弈优化的BP神经网络(分类应用) - 附代码

基于混沌博弈优化的BP神经网络(分类应用) - 附代码 文章目录 基于混沌博弈优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.混沌博弈优化BP神经网络3.1 BP神经网络参数设置3.2 混沌博弈算法应用 4.测试结果…

【汇编语言特别篇】DOSBox及常用汇编工具的详细安装教程

文章目录 📋前言一. ⛳️dosbox的介绍、下载和安装1.1 🔔dosbos简介1.2 🔔dosbox的下载1.2.1 👻方式一:官网下载(推荐)1.2.2 👻方式二:网盘安装包 1.3 🔔dosbox的安装1.4 &#x1f5…

CSS 滚动驱动动画 timeline-scope

timeline-scope 语法兼容性 timeline-scope 看到 scope 就知道这个属性是和范围有关, 没错, timeline-scope 就是用来修改一个具名时间线(named animation timeline)的范围. 我们介绍过的两种时间线 scroll progress timeline 和 view progress timeline, 使用这两种时间线(通…