jvm(HotSpotVM)学习记录

1:当我们写的java文件经过编译器编译后生成class文件。class文件里面包含了各种java语言规范的特定语法。可以通过javap -v -private xxx.class 例如:

javap -v -private Gas.class
Classfile /D:/project/ike-springboot-carbonzero-v2/springboot-bms-api/target/classes/ike/cz/bms/importGas/Gas.classLast modified 2024-1-26; size 2598 bytesMD5 checksum ade0f6bf4e5a00e0845d157d728f4cdaCompiled from "Gas.java"
public class ike.cz.bms.importGas.Gasminor version: 0major version: 61flags: ACC_PUBLIC, ACC_SUPER
Constant pool:#1 = Methodref          #2.#3          // java/lang/Object."<init>":()V#2 = Class              #4             // java/lang/Object
..........

2:由jvm的类加载器,负责将这些class文件进行加载。加载通过父类双亲委派机制,(向上查找,向下加载。)jvm的类加载器由:Bootstrap ClassLoader(负责加载JAVA_HOME中jre/lib/rt.jar里所有的class) =>Extension ClassLoader(JAVA_HO ME中jre/lib/*.jar或-Djava.ext.dirs指定目录下的jar包) =>App ClassLoader(加载classpath中指定的jar包及目录中class) => Custom ClassLoader(用户自定义的ClassLoader)。
父类双亲委派机制:(先去看自己缓存有没有这个class,如果没有则向上委托查找。)首先会看Custom ClassLoader中的缓存中是否存在,如果不存在,则向上父类的App ClassLoader加载,如果App ClassLoader缓存里没有,则向Extension ClassLoader加载,如果Extension ClassLoader缓存里没有,则Bootstrap ClassLoader加载,然后Bootstrap ClassLoader先看缓存里有没。没有则让子类进行加载,一直找,找不到则报 类找不到异常(class not found exception)。
3:加载完成后,由运行期系统进行解释执行解释:(包括字节码解释器:(一条一条地读取,解释并且执行字节码指令),即时编译器:(把整段字节码不加筛选的编译成机器码不论其执行频率是否有编译价值,在程序响应时间的限制下,没有达
到最大的优化。),jvm通常采用混合模式,结合两者优点进行),执行:jvm会先把解释后的进行执行。
执行就会涉及到jvm内存模型:用于存放不同的数据。
jvm内存模型线程独享区(程序计数器,本地方法栈,虚拟机栈)和线程共享区(方法区,java堆)
程序计数器:唯一一个不会oom的地方。
虚拟机栈:栈帧,存放在局部变量操作数栈,动态链接,方法出口。每一个方法的调用过程就是一个栈帧再虚拟机栈中入栈到出栈的过程 调优参数:-Xss1024m,g,kb。(单位选择m,g,kb),如果StackOverflowError,一般为循环调用深度太深导致(这个会涉及到压栈和出栈)。建议检查代码的合理性
java堆:存放对象实例,和数组。垃圾回收发生的地方。里面分为(新生代分为(eden,s0,s1),老年代),调优参数有:-Xms6m:设置堆的初始大小为6
m,-Xmx6m:堆最大内存值为6m。-Xms-Xmx通常设置为相同。-Xmn:年轻代大小
方法区:存放类信息,常量,接口方法字段等


以下为GC相关学习记录:


STW时间 : (“Stop The World”)垃圾回收时暂停用户线程的时间。
JDK1.8默认使用使用的垃圾回收器
年轻代使用:Parallel Scavenge又称Parallel。

1.年轻代使用复制算法、并行回收、STW机制。
2.吞吐量可控制。
3.拥有自适应调节策略(能够根据程序需求自动分配内存空间)。
4.回收年轻代的并行垃圾回收器。

年老代使用Parallel Old

作用在老年代,和Parallel配合使用 采用标记-压缩算法、并行回收、STW机制

如何判断一个对象是否应该被回收?

判断一个对象是否可达,不可达对象就将被回收,所谓可达就是从GCROOT开始是否是可以找到该对象 GCROOT是什么?
1、虚拟机栈中引用的对象(本地变量表)
2、方法区中静态属性引用的对象
3、方法区中常量引用的对象
4、本地方法栈中引用的对象(Native Object)

GC类型:

Eden内存空间进行清理的GC我们称之为Minor GC
2.Old区的GC我们称作为Major GC
3.新生代(Minor GC)+老年代(Major GC) Full GC

堆内存空间:分为年轻代老年代,年轻代gc+老年代gc = full gc
新生代(Young)与老年代的比例值为 1:2(该值可以通过参数 -XX:NewRatio来指定)。
年轻代:Minor GC也称(Young GC),采用复制清理算法

1.Eden区(伊甸园,新生命初创的地方):对象刚刚创建的地方,当Eden快满时采用复制清理算法触发Minor GC也称(Young GC),把不会清楚的对象复制到S0区或者S1区。然后删除Eden区+s0或者s1区,并且每次会对幸存的对象进行+1操作。
2.s0和s1区:当s0或者s1区快满了,并且当超过某个次数后(默认15 -XX:MaxTenuringThreshold”来设置),就把s0或者s1区的对象放入老年代。
3.假如说当前放对象的Survivor区域里,一批对象的总大小大于了这块Survivor区域的内存大小的50%,
那么此时大于等于这批对象年龄的最大值对象,就可以直接进入老年代了
4.年轻代分为了Eden,s0,s1。默认比值为:8:1:1(可以通过参数-XX:SurvivorRatio来设定)。

老年代 Major GC,采用标记清除和标记整理算法。
垃圾进入老年代的触发条件

1.当s0或者s1区快满了,并且当超过某个次数后(默认15 -XX:MaxTenuringThreshold”来设置),就把s0或者s1区的对象放入老年代。
2.假如说当前放对象的Survivor区域里,一批对象的总大小大于了这块Survivor区域的内存大小的50%,
3.大对象直接进入老年代
4.Minor GC后的对象太多
Minor GC后的对象太多无法放入Survivor区 这个时候就必须得把这些对象直接转移到老年代去

GC垃圾回收算法:

标记清除:先标记垃圾对象,后清除。内存碎片化严重
复制清除:内存分为两部分:存活对象放一边,回收对象放一边。然后回收。内存使用率低
标记整理:先标记,然后存活的对象都向一端移动,然后直接清理掉端边界以外的内存,这种算法可以有效地减少内存碎片,提高内存的利用率。。如下图:

在这里插入图片描述
垃圾回收器是这些GC垃圾回收算法的执行者。

垃圾回收器的分类
根据线程的数量来分:

单线程(串行)垃圾回收器 :Serial、Serial Old;
多线程(并行)垃圾回收器:Parnew、Parallel Scavenge、Parallel Old

根据工作内存来分:

新生代垃圾回收器:Serial、Parnew、Parallel Scavenge;
老年代垃圾回收器:Serial Old、Parallel Old、CMS。

根据工作模式分:

独占式垃圾回收器:Serial、Parnew、Parallel Scavenge;
并发式垃圾回收器:CMS、G1。

HotSpot垃圾回收器
图中展示了 7 种作用于不同分代的收集器,如果两个收集器之间存在连线, 则说明它们可以搭配使用。虚拟机所处的区域则表示它是属于新生代还是老年代收集器。
在这里插入图片描述
CMS垃圾回收器
CMS基于标记清除算法,因此会产生内存碎片,当大作业到来时,可能会提前触发Full GC。
标记整理算法是需要移动对象的,但是CMS在清理垃圾的时候是与用户线程并发执行的。其他两个是采用了标记整理算法

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

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

相关文章

探索智慧农业精准除草,基于高精度YOLOv5全系列参数【n/s/m/l/x】模型开发构建农田作物场景下杂草作物分割检测识别分析系统

智慧农业是未来的一个新兴赛道&#xff0c;随着科技的普及与落地应用&#xff0c;会有更加广阔的发展空间&#xff0c;关于农田作物场景下的项目开发实践&#xff0c;在我们前面的博文中也有很堵相关的实践&#xff0c;单大都是偏向于目标检测方向的&#xff0c;感兴趣可以自行…

多焦点图像融合文献学习(一)

本文介绍的是一篇明为"A convolutional neural network-based conditional random field model for structured multi-focus image fusion robust to noise."的文献&#xff0c;主要包括文献的摘要、前言摘选、主要贡献、网络结构、实验结果及结论等方面。 文献名称摘…

CorelDRAW25.0.0.230最新2024版本Crack下载安装方法

CorelDRAW (CDR)是一款专业的平面设计软件。本软件是由加拿大Corel公司开发的一款功能强大的专业平面设计软件、矢量设计软件、矢量绘图软件。本矢量图形制作工具软件广泛应用于商标设计、标志制作、封面设计、CIS设计、产品包装设计、模型绘制、插画绘制、时装/服装设计、印刷…

Linux——信号的保存与处理

目录 前言 一、信号的常见概念 1.信号递达 2.信号未决 3.信号阻塞 二、Linux中的递达未决阻塞 三、信号集 四、信号集的处理 1.sig相关函数 2.sigprocmask()函数 3.sigpending()函数 五、信号的处理时机 六、信号处理函数 前言 在之前&#xff0c;我们学习了信号…

最近Sentinel-2下载网站好像有点问题

最近Sentinel-2下载网站好像有点点问题&#xff0c;基本属于打不开的状态&#xff01; 这也难怪&#xff0c;Sentinel提供了全世界最好的免费遥感资源。其受欢迎程度可以想象的到&#xff01;这么多人访问网站&#xff0c;网站压力可以说是巨大的。这可是全世界的并发访问&…

C/C++语言学习路线: 嵌入式开发、底层软件、操作系统方向(持续更新)

初级&#xff1a;用好手上的锤子 1 【感性】认识 C 系编程语言开发调试过程 1.1 视频教程点到为止 1.2 炫技视频看看就行 1.3 编程游戏不玩也罢 有些游戏的主题任务就是编程&#xff0c;游戏和实际应用环境有一定差异&#xff08;工具、操作流程&#xff09;&#xff0c;在…

Haproxy2.8.1+Lua5.1.4部署,haproxy.cfg配置文件详解和演示

目录 一.快速安装lua和haproxy 二.配置haproxy的配置文件 三.配置haproxy的全局日志 四.测试负载均衡、监控和日志效果 五.server常用可选项 1.check 2.weight 3.backup 4.disabled 5.redirect prefix和redir 6.maxconn 六.调度算法 1.静态 2.动态 一.快速安装lu…

Excel 打开后提示:MicrosoftExcel无法计算某个公式。在打开的工作簿中有一个循环引用...

目录预览 一、问题描述二、原因分析三、解决方案四、参考链接 一、问题描述 MicrosoftExcel无法计算某个公式。在打开的工作簿中有一个循环引用&#xff0c;但无法列出导致循环的引I用。请尝试编辑上次输入的公式&#xff0c;或利用“撤消”命令删除该公式&#xff0c;如下图&…

利用R语言和curl库实现网页爬虫的技术要点解析

R语言简介 R语言是一种自由、跨平台的编程语言和软件环境&#xff0c;专门用于统计计算和数据可视化。它具有丰富的数据处理、统计分析和图形展示功能&#xff0c;被广泛应用于数据科学、机器学习、统计建模等领域。 R语言技术优势 丰富的数据处理功能&#xff1a; R语言拥有…

comfyui 插件

Stable Diffusion ComfyUI 基础教程&#xff08;一&#xff09; ComfyUI安装与常用插件 - 知乎最近发现很多人在搬运我的文章&#xff0c;&#xff0c;&#xff0c;&#xff0c;那我也发 前言&#xff1a;相信大家玩 Stable Diffusion&#xff08;以下简称SD&#xff09;都是用…

【有芯职说】数字芯片BES工程师

一、 数字芯片BES工程师简介 今天来聊聊数字芯片BES工程师&#xff0c;其中BES是Back End Support的缩写&#xff0c;就是后端支持的意思。其实这个岗位是数字IC前端设计和数字IC后端设计之间的一座桥&#xff0c;完成从寄存器传输级设计到具体工艺的mapping和实现。这个岗位在…

a = 3中的3在栈中还是堆中?

1、栈区&#xff08;stack&#xff09; 由编译器自动分配释放&#xff0c;存放函数的参数值&#xff0c;局部变量的值等。 2、堆区&#xff08;heap&#xff09; 是一个可动态申请的内存空间&#xff08;其记录空闲内存空间的链表由操作系统维护&#xff09;&#xff0c;在j…