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,可能为循环调用深度太深导致(这个会涉及到压栈和出栈)。建议检查代码的合理性
本地方法栈:与虚拟机栈相似,但是只服务于本地(Native) 方法服务。
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来指定)。
年轻代分为:Eden区,s0,s1区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.mzph.cn/news/784626.shtml

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

相关文章

前端三剑客 —— CSS (第二节)

目录 内容回顾&#xff1a; CSS选择器*** 属性选择器 伪类选择器 1&#xff09;:link 超链接点击之前 2&#xff09;:visited 超链接点击之后 3&#xff09;:hover 鼠标悬停在某个标签上时 4&#xff09;:active 鼠标点击某个标签时&#xff0c;但没有松开 5&#xff09;:fo…

LabVIEW动车组谐波分析与检测系统

LabVIEW动车组谐波分析与检测系统 随着中国高速铁路网络的快速发展&#xff0c;动车组数量和运行速度的不断提升&#xff0c;其产生的谐波问题对电网产生了不小的影响。基于图形化编程语言LabVIEW&#xff0c;开发了一套动车组谐波分析与检测系统&#xff0c;旨在实时监控与分…

机器视觉/将HIK海康面阵相机连接Halcon软件

文章目录 概述工业相机客户端动态库拷贝Halcon连接HIK相机的配置相机参数其他 概述 本文简述了如何将海康面阵相机连接到Halcon软件中进行实时取图的过程。 补充&#xff0c; 整个实践过程使用 17.12 / x64-win64 Halcon 软件版本 海康 MV-CE200-10GM 面阵相机。从左到右简解…

B树、B+树、哈夫曼树

目录 1. B树2. B树3. 哈夫曼树 1. B树 特点&#xff1a;一个节点当中可以有多个值&#xff0c;节点内部key 值是有序的&#xff0c;节点内部存储的是key-value类型的数据 磁盘中文件存储用B树。 4阶B树一个节点最多三个key值 5阶B树一个节点最多四个key值 B树有很多的分支&…

华为OD机试 - 绘图机器 - 双指针(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

Matlab中的脚本和函数

Matlab中的脚本和函数 文章目录 Matlab中的脚本和函数脚本创建脚本代码注释函数创建函数局部函数嵌套函数私有函数匿名函数补充知识函数句柄测试环境:Win11 + Matlab R2021a 脚本 ​ Matlab脚本是最简单的程序文件类型。它们可用于自动执行一系列 Matlab 命令,如命令行重复执…

ROS2 学习(一)ROS2 简介与基本使用

参考引用 动手学 ROS2 1. ROS2 介绍与安装 1.1 ROS2 的历史 ROS&#xff08;Robot Operating System&#xff0c;机器人操作系统&#xff09;&#xff0c;但 ROS 本身并不是一个操作系统&#xff0c;而是可以安装在现在已有的操作系统上&#xff08;Linux、Windows、Mac&…

『VUE』07. v-for 的规范性:通过key管理状态 就地更新渲染策略(详细图文注释)

目录 vue渲染的就地更新策略一个例子说明key的必要性示例代码总结 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 如果你遇到了你的页面元素莫名其妙的呈现顺序,可能是你没有设置key. vue渲染的就地更新策略 在 Vue 中&#xff…

08、JS实现:数组两数之和算法的两种解决方案(一步一步剖析,很详细)

数组两数之和的算法 Ⅰ、数组两数之和算法的方案一&#xff1a;1、题目描述&#xff1a;2、解题思路&#xff1a;3、实现代码&#xff1a; Ⅱ、数组两数之和算法的方案二&#xff1a;1、实现代码&#xff1a; Ⅲ、小结&#xff1a; Ⅰ、数组两数之和算法的方案一&#xff1a; …

BIONIOAIO

通信技术整体解决的问题 1.局域网内的通信要求 2.多系统间的底层消息传递机制 3.高并发下&#xff0c;大数据量的通信场景需要 4.游戏行业。无论是手游服务端、还是大型网络游戏&#xff0c;java的应用越来越广 IO模型基本说明 就是用什么样的通道或者说是通信模式和架构…

数据结构——二叉树——堆

前言&#xff1a; 在前面我们已经学习了数据结构的基础操作&#xff1a;顺序表和链表及其相关内容&#xff0c;今天我们来学一点有些难度的知识——数据结构中的二叉树&#xff0c;今天我们先来学习二叉树中堆的知识&#xff0c;这部分内容还是非常有意思的&#xff0c;下面我们…

前端xss攻击——规避innerHtml过滤标签节点及属性

文章目录 ⭐前言⭐规避innerHtml&#x1f496;在iframe中使用innerHtml的场景&#x1f496;标签转义&#x1f496;url 进行encode&#x1f496;手动过滤内容转义 ⭐inscode代码块演示⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享xss攻击——规避innerHtml过…

list(链表)容器(一)

一、list基本概念 链表&#xff08;list&#xff09;是一种物理存储单元上非连续的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接实现的 链表的组成&#xff1a;链表由一系列结点组成 结点的组成&#xff1a;一个是存储数据元素的数据域&#xff0…

通过pymysql读取数据库中表格并保存到excel(实用篇)

本篇文章是通过pymysql将本地数据库中的指定表格保存到excel的操作。 这里我们假设本地已经安装了对应的数据库管理工具&#xff0c;里面有一个指定的表格&#xff0c;现在通过python程序&#xff0c;通过调用pymysql进行读取并保存到excel中。 关于数据库管理工具是Navicat P…

【题解】—— LeetCode一周小结13

【题解】—— 每日一道题目栏 上接&#xff1a;【题解】—— LeetCode一周小结12 25.零钱兑换 II 题目链接&#xff1a;518. 零钱兑换 II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合…

NVIDIA Jetson Xavier NX入门-镜像为jetpack5(3)——pytorch和torchvision安装

NVIDIA Jetson Xavier NX入门-镜像为jetpack5&#xff08;3&#xff09;——pytorch和torchvision安装 镜像为jetpack5系列&#xff1a; NVIDIA Jetson Xavier NX入门-镜像为jetpack5&#xff08;1&#xff09;——镜像烧写 NVIDIA Jetson Xavier NX入门-镜像为jetpack5&#…

PI案例分享--2000A核心电源网络的设计、仿真与验证

目录 摘要 0 引言 1 为什么需要 2000A 的数字电子产品? 2 2000A 的供电电源设计 2.1 "MPM3698 2*MPM3699"的 MPS扩展电源架构 2.2 使用恒定导通时间(COT)模式输出核心电压的原因 2.3 模块化 VRM 的优势 2.4 用步进负载验证2000A的设计难点 2.4.1 电源网络 …

机器人---人形机器人之技术方向

1 背景介绍 在前面的文章《行业杂谈---人形机器人的未来》中&#xff0c;笔者初步介绍了人形机器人的未来发展趋势。同智能汽车一样&#xff0c;它也会是未来机器人领域的一个重要分支。目前地球上最高智慧的结晶体就是人类&#xff0c;那么人形机器人的未来会有非常大的发展空…

【深度学习】球衣号码识别 re-id追踪

1. CLIP-ReIdent: Contrastive Training for Player Re-Identification 论文解析–2023的论文&#xff0c;貌似顶会 论文方法是类不可知的&#xff0c;微调CLIP vitl/14模型&#xff0c;在MMSports 2022球员重新识别挑战中实现98.44%的mAP。此外&#xff0c;CLIP Vision Trans…

在 C#和ASP.NET Core中创建 gRPC 客户端和服务器

关于gRPC和Google protobuf gRPC 是一种可以跨语言运行的现代高性能远程过程调用 (RPC) 框架。gRPC 实际上已经成为 RPC 框架的行业标准&#xff0c;Google 内外的组织都在使用它来从微服务到计算的“最后一英里”&#xff08;移动、网络和物联网&#xff09;的强大用例。 gRP…