jvm(HotSpotVM)学习记录

news/2024/4/27 19:23:50/文章来源:https://blog.csdn.net/qq_40353040/article/details/135917556

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.luyixian.cn/news_show_1027281.aspx

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

相关文章

业务服务:xss攻击

文章目录 前言一、使用注解预防1. 添加依赖2. 自定义注解3. 自定义校验逻辑4. 使用 二、使用过滤器1. 添加配置2. 创建配置类3. 创建过滤器4. 创建过滤器类5. 使用 前言 xss攻击时安全领域中非常常见的一种方法&#xff0c;保证我们的系统安全是非常重要的 xss攻击简单来说就…

【Nuxt3】环境文件.env的使用

简言 记录下环境文件.env的用法。 .env .env 文件指定了构建/开发时的环境变量。 在开发模式下以及运行 nuxi build 和 nuxi generate 时&#xff0c;Nuxt CLI 内置了 dotenv 支持。 除了任何进程环境变量外&#xff0c;如果你在项目根目录下有一个 .env 文件&#xff0c;…

swagger/knife4j 接口文档增加图标 springboot

1.在资源目录下增加图标文件 2.配置/favicon.ico 资源 Configuration public class WebConfig implements WebMvcConfigurer {Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/favicon.ico").addResour…

华为云使用指南02

5.​​使用GitLab进行团队及项目管理​​ GitLab旨在帮助团队进行项目开发协作&#xff0c;为软件开发和运营生命周期提供了一个完整的DevOps方案。GitLab功能包括&#xff1a;项目源码的管理、计划、创建、验证、集成、发布、配置、监视和保护应用程序等。该镜像基于CentOS操…

编译安装飞桨fastdeploy@FreeBSD(失败)

FastDeploy是一款全场景、易用灵活、极致高效的AI推理部署工具&#xff0c; 支持云边端部署。提供超过 &#x1f525;160 Text&#xff0c;Vision&#xff0c; Speech和跨模态模型&#x1f4e6;开箱即用的部署体验&#xff0c;并实现&#x1f51a;端到端的推理性能优化。包括 物…

samba实现linux共享文件夹

一、samba安装 sudo apt install samba 二、配置Samba 编辑Samba配置文件sudo vi /etc/samba/smb.conf 在文件末尾添加以下内容&#xff0c;设置一个简单的共享目录&#xff08;替换path_to_share为实际的共享目录路径&#xff09;&#xff1a; [Share] path /path_to_sha…

上位机图像处理和嵌入式模块部署(qmacvisual图像修复)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 qmacvisual提供了一个图像修复的功能。所谓的图像修复&#xff0c;就是对图像中缺省的部分进行修补&#xff0c;它的操作&#xff0c;其实分成两个…

Unity---ToLua 逻辑热更新

13.2 逻辑热更新——Lua3-1_哔哩哔哩_bilibili ulua https://github.com/topameng/tolua

每日一题 --- 链表相交[力扣][Go]

链表相交 题目&#xff1a;面试题 02.07. 链表相交 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交**&#xff1a;** 题目数据 保证 整个链式结…

什么?Postman也能测WebSocket接口了?

01、WebSocket 简介 WebSocket是一种在单个TCP连接上进行全双工通信的协议。 WebSocket使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据。在WebSocket API中&#xff0c;浏览器和服务器只需要完成一次握手&#xff0c;两者之间就直…

超级好用的Linux系统远程连接工具FinalShell

FinalShell是一体化的的服务器,网络管理软件,不仅是ssh客户端,还是功能强大的开发,运维工具,充分满足开发,运维需求&#xff0c;现在可以免费激活了&#xff01;&#xff01;&#xff01; 介绍 特色功能: 1、多平台支持Windows,macOS,Linux 2、多标签,批量服务器管理 3、漂…

南京观海微电子---Vitis HLS的工作机制——Vitis HLS教程

1. 前言 Vitis HLS&#xff08;原VivadoHLS&#xff09;是一个高级综合工具。用户可以通过该工具直接将C、 C编写的函数翻译成HDL硬件描述语言&#xff0c;最终再映射成FPGA内部的LUT、DSP资源以及RAM资源等。 用户通过Vitis HLS&#xff0c;使用C/C代码来开发RTL IP核&#x…

Web框架开发-Django中间件

一、中间件的概念 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。因为改变的是全局,所以需要谨慎实用,用不好会影响到性能。 Django的中间件的定义: Middleware is a framework of hooks into Dj…

如何利用webpack来优化前端性能

当涉及前端性能优化时&#xff0c;Webpack 是一款不可或缺的工具。它不仅仅是一个模块打包工具&#xff0c;还提供了各种功能和插件&#xff0c;可以帮助开发人员优化前端应用程序的性能。在这篇文章中&#xff0c;我们将深入探讨如何有效地利用 Webpack 来优化前端性能&#x…

echarts 3D示例 echart, echarts-gl

echarts官网有很多的炫酷的3D模型 来尝试实现下&#xff0c;使用原本的柱状图或者折线图代码创建echarts示例,使用cdn的方式引入echarts <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewp…

Spring高级面试题-2024

Spring 框架中都用到了哪些设计模式&#xff1f; 1. 简单工厂&#xff1a; ○ BeanFactory&#xff1a;Spring的BeanFactory充当工厂&#xff0c;负责根据配置信息创建Bean实例。它是一种工厂模式的应用&#xff0c;根据指定的类名或ID创建Bean对象。2. 工厂方法&#xff…

vue实现把Ox格式颜色值转换成rgb渐变颜色值(开箱即用)

图示&#xff1a; 核心代码&#xff1a; //将0x格式的颜色转换为Hex格式&#xff0c;并计算插值返回rgb颜色 Vue.prototype.$convertToHex function (colorCode1, colorCode2, amount) {// 确保输入是字符串&#xff0c;并检查是否以0x开头let newCode1 let newCode2 if (t…

独立站攻略|如何使用SEO代理优化网站排名?

每天&#xff0c;互联网上都会生成和共享大量信息&#xff0c;这使得预测哪个关键字或主题将成为趋势变得很有挑战性&#xff0c;因此人们可以预测和优化他们的搜索引擎排名。但使用“SEO 代理”&#xff0c;就会使得SEO优化更加有效且精准。 一、什么是SEO&#xff1f; 简而言…

2024 年排名前 5 的 Node.js 后端框架

自 2009 年以来&#xff0c;Node.js 一直是人们谈论的话题&#xff0c;大多数后端开发人员都倾向于使用 Node.js。在过去的几年里&#xff0c;它的受欢迎程度有所增加。它被认为是美国最受欢迎的网络开发工具&#xff0c;包括 Netflix 和 PayPal 等客户。 受欢迎程度增加的原因…

Swagger添加JWT验证(ASP.NET)

文章目录 JWT1、解析2、配置JWT JWT 1、解析 1&#xff09;客户端向授权服务系统发起请求&#xff0c;申请获取“令牌”。 2&#xff09;授权服务根据用户身份&#xff0c;生成一张专属“令牌”&#xff0c;并将该“令牌”以JWT规范返回给客户端 3&#xff09;客户端将获取到的…