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.rhkb.cn/news/163845.html

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

相关文章

持续集成工具jenkins操作

安装Jenkins 下载jenkins安装包 linux上下载jenkins失败 开始在windows上安装jenkins 1、先安装JDK https://jingyan.baidu.com/article/fdbd4277dd90f0b89e3f489f.html 免安装版本JDK只需要解压配置环境变量即可 2、安装Jenkins 参考文档: https://www.cnb…

ELK 单机安装

一丶软件下载 elasticsearch: https://www.elastic.co/downloads/past-releases kibana: https://www.elastic.co/downloads/past-releases 选择对应的版本的下载即可 二、es 安装es比较简单 rpm -ivh elasticsearch-2.4.2.rpm 修改配置文件 /etc/elasticsearch/elas…

使用 Typhoeus 和 Ruby 编写的爬虫程序

以下是一个使用 Typhoeus 和 Ruby 编写的爬虫程序,用于爬取 ,同时使用了 jshk.com.cn/get_proxy 这段代码获取代理: #!/usr/bin/env rubyrequire typhoeus require jsondef get_proxyurl "https://www.duoip.cn/get_proxy"respon…

Jmeter —— jmeter参数化实现

jmeter参数化 在实际的测试工作中,我们经常需要对多组不同的输入数据,进行同样的测试操作步骤,以验证我们的软件的功能。这种测试方式在业界称为数据驱动测试, 而在实际测试工作中,测试工具中实现不同数据输入的过程称…

docker 配置mongoDB

## 拉取镜像 docker pull mongo## 设置默认账号密码 test:test 默认数据 test docker run -d --name mongo-container -e MONGO_INITDB_ROOT_USERNAMEtest -e MONGO_INITDB_ROOT_PASSWORDtest -e MONGO_INITDB_DATABASEtest -p 27017:27017 mongo

003数据安全传输-多端协议传输平台:Protobuf - 部署

文章目录 一、Windows环境二、Linux Centos环境三、protobuf测试3.1 新建.proto文件生成相应的类3.2 .proto生成相应的类的使用3.3 配置VS3.4 test代码 一、Windows环境 在windows下配置,无论protobuf是什么版本,IDE和编译器的版本都要保持一致。 比如…

SpringBoot结合Druid实现SQL监控

1、前言 SpringBoot不用我多介绍了吧,目前后端最流行的框架。后端开发人员最基本的要求。 Druid数据库连接池,出自国内 ”java圣地" 阿里巴巴。 Druid是一个用于大数据实时查询和分析的高容错、高性能开源分布式系统,旨在快速处理大规模…

基于nodejs+vue 衣服穿搭推荐系统

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…

Linux内核8. Linux内核的经典调试方式

1 内核调试以及工具总结 内核总是那么捉摸不透, 内核也会犯错, 但是调试却不能像用户空间程序那样, 为此内核开发者为我们提供了一系列的工具和系统来支持内核的调试. 内核的调试, 其本质是内核空间与用户空间的数据交换, 内核开发者们提供了多样的形式来完成这一功能. 2 用户…

第十六届中国智慧城市大会 | 国产化三维重建技术服务智慧城市建设

2023年10月13日,由武汉大势智慧科技有限公司、飞燕航空遥感技术有限公司主办的第十六届智慧城市大会-实景三维技术创新与应用论坛在广州成功举办。 来自实景三维、自然资源、数字孪生、AI大数据、航空遥感等多个领域的专家,深度分享各自的智慧城市建设经…

QT基础 柱状图

目录 1.QBarSeries 2.QHorizontalBarSeries 3.QPercentBarSeries 4.QHorizontalPercentBarSeries 5.QStackedBarSeries 6.QHorizontalStackedBarSeries 从上图得知柱状的基类是QAbstractBarSeries,派生出来分别是柱状图的水平和垂直类,只是类型…

BAT030:按列表名单将路径a下的文件夹批量复制到路径b

引言:编写批处理程序,实现按列表名单将路径a下的文件夹批量复制到路径b。 一、新建Windows批处理文件 参考博客: CSDNhttps://mp.csdn.net/mp_blog/creation/editor/132137544 二、写入批处理代码 1.右键新建的批处理文件,点击…

分布式微服务技术栈-SpringCloud<Eureka,Ribbon,nacos>

微服务技术栈 一、微服务 介绍了解1 架构结构案例与 springboot 兼容关系拆分案例拆分服务拆分-服务远程调用 2 eureka注册中心Eureka-提供者与消费者Eureka-eureka原理分析Eureka-搭建eureka服务Eureka-服务注册Eureka-服务发现 3 Ribbon组件 负载均衡Ribbon-负载均衡原理Ribb…

浅谈压力测试的重要目标及意义

随着互联网应用的快速发展,软件系统的稳定性和性能成为了用户和企业关注的焦点。用户期望应用程序能够在高负载下依然保持稳定和高效。为了满足这一需求,压力测试成为了不可或缺的一环。本文将探讨压力测试的重要性以及如何进行压力测试。 一、压力测试的…

大数据中间件——Kafka

Kafka安装配置 首先我们把kafka的安装包上传到虚拟机中: 解压到对应的目录并修改对应的文件名: 首先我们来到kafka的config目录,我们第一个要修改的文件就是server.properties文件,修改内容如下: # Licensed to the …

分类预测 | MATLAB实现基于BiLSTM-AdaBoost双向长短期记忆网络结合AdaBoost多输入分类预测

分类预测 | MATLAB实现基于BiLSTM-AdaBoost双向长短期记忆网络结合AdaBoost多输入分类预测 目录 分类预测 | MATLAB实现基于BiLSTM-AdaBoost双向长短期记忆网络结合AdaBoost多输入分类预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于BiLSTM-…

在中国,技术到底有多有用?

🙌秋名山码民的主页 😂oi退役选手,Java、大数据、单片机、IoT均有所涉猎,热爱技术,技术无罪 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 获取源码,添加WX 目录 前言1.…

【四:Spring整合Junit】

目录 相同点不同点1、导入依赖增加2、编写的位置不同。。路径一定要与实现类一致 相同点 前面都一样和Spring整合mybatis&#xff08;基于注解形式&#xff09;一样Spring整合Mybatis 不同点 1、导入依赖增加 <!-- 单元测试 --><dependency><groupId>junit&…

MYSQL学习笔记2-mysql数据文件

1.mysql数据文件类型&#xff1f;5.7和8的一些区别 创建一个anadb的数据库&#xff1a;在mysql安装目录下data目录下会产生一个同名的文件夹 建表&#xff1a;图为mysql57的数据文件图&#xff0c;不同的引擎建表会产生不同后缀名的文件 &#xff0c;mysql5.5以上默认使用 inno…

【高等数学】导数与微分

文章目录 1、导数的概念1.1、引例1.1.1、变速直线运动瞬时速度1.1.2、曲线的切线 1.2、导数的定义1.3、证明常用导数1.4、导数的几何意义1.5、可导与连续的关系 2、函数的求导法则2.1、函数的和、差、积、商的求导法则2.2、反函数的求导法则2.3、复合函数的求导法则2.4、基本初…