当前位置: 首页 > news >正文

JVM分享

JVM分享

官网:https://docs.oracle.com/javase/specs/jvms/se8/html/index.html

Java代码的执行流程

我们编写完之后的java文件如果要运行,java文件会编译成class文件,在jvm中运行时ClassLoader会加载class文件,加载进来之后,就到了运行时数据区之中。

Field Descriptors 字段描述符

Method Descriptors 方法描述符

JVM运行时数据区

在官网的2.5. Run-Time Data Areas章节

2.5.1. The pc Register

pc计数器存放的是当前正在执行的指令的地址。

2.5.2. Java Virtual Machine Stacks

当我们创建一个线程时,会创建一个jvm虚拟机栈,调用执行任何方法都会给对应方法创建栈帧,然后入栈,当程序发生异常时(经典异常:StackOverflowError),异常信息就是从虚拟机栈中打印出来了。存放了各种基本数据类型、对象引用。

2.5.3. Heap

堆是所有jvm线程共享的,堆也是是运行时数据区,从中分配所有类实例和数组的内存。堆在虚拟机启动时创建,GC可以回收堆内存。同时创建的对象也存放在堆中。所以在堆中最常见的异常就是OutOfMemoryError

2.5.4. Method Area

方法区也是所有jvm线程共享的,方法区类似于常规语言的编译代码的存储区域,里面存放的是每个类class的结构,例如运行时常量池,字段和方法数据,以及方法和构造函数的代码。1.8之前的jdk版本,Metaspace是永久代(堆内),从1.8版本开始。永久代被移除,新增了Metaspace,Metaspace使用的是本地内存。

2.5.5. Run-Time Constant Pool

常量池用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。

2.5.6. Native Method Stacks

本地方法栈与虚拟机栈所发挥的作用非常相似,他们之间的区别不过是虚拟机栈为虚拟机执行Java方法(字节码)服务,而本地方法栈则为虚拟机中使用到的native方法服务。

JVM的内存结构

jvm1.8中内存主要分为两大区域,堆与非堆。

堆是Heap,非堆也就是Metaspace。然后堆又分为两部分,YoungOld区。Young中又分为两部分,分为EdenSurvivorSurvivor区又分为From Survivor空间也就是俗称的S0和 To Survivor空间也就是S1。

S0跟S1大小是相同的,并且同一时间只有一个是开启的,另外一个是空的。正常来说,新生成的对象首先放到年轻代Eden区,当Eden空间满了,触发第一次Minor GC,存活下来的对象移动到S0区,S0区满后再触发一次 GC,S0区存活对象移动到S1区,这样保证了一段时间内总有一个survivor区为空。然后每进行一次GC,对象的age就会+1,age到了15(也就是MaxTenuringThreshold 从年轻代到老年代的晋升次数的最大值)之后,对象就会进入老年代。

非堆也就是Metaspace,他也分为两部分,一个是ccs(Compressed Class Space),另一个是CodeCache。

指针有短指针32位跟长指针64位,ccs开启之后才会在Metaspace中存在,并且会用32位的短指针代替64位的长指针。堆中的对象都有一个指向自己class的指针,而class是在Metaspace中,在64位环境中指针一般是64位,有时候为了提高性能会启用ccs,将指针压缩成32位。

CodeCache它主要用于存放JIT(即时编译)所编译的代码,编译了就会存在,没有就不会。

Java mixed mode

Java的混合模式,Java既是解释型(int)又是编译型(comp)语言。

JVM参数类型

  1. 标准参数,标准参数是稳定的java参数,一般不会随着版本的升级出现变化,常见的有version help classpath cp等。

  2. X参数,随着版本相对变化较少,最经典的参数 -Xint -Xcomp。java -Xint -version java -Xcomp -version

  3. XX参数,随着版本变化较大,参数又分为boolean跟非boolean类型。

    a.boolean -XX: [+/-] name

    例:-XX:+UseG1GC / -XX:-UseG1GC

    b.非boolean -XX: name = value

    例:-XX:MetaspaceSize=128m

    -XX:SurvivorRatio=8

    -XX:NewRatio=2

    -XX:MaxTenuringThreshold=15

PrintFlags系列参数

java -XX:+PrintFlagsInitial

-XX:+PrintFlagsInitial-XX:+PrintFlagsFinal,= 表示默认值,:=表示修改过的

几个特殊的XX参数:

-Xms:表示min, 是 -XX:InitialHeapSize的简写

-Xmx:表示max,是-XX:MaxHeapSize的简写

-Xss 是-XX:ThreadStackSize

-XX:InitialHeapSize=268435456 ≈ 268M 1/64个内存大小

-XX:MaxHeapSize=4294967296 ≈ 4.2G 1/4个内存大小

垃圾回收

1.确定会被回收的对象,两种方式

​ 1:引用计数,在堆中存储对象时,在对象头处维护一个counter计数器,如果一个对象增加了一个引用与之相 连,则将counter++。如果一个引用关系失效则counter–。如果一个对象的counter变为0,则说明该对象已经 被废弃,不处于存活状态。

​ 2:枚举根节点可达性分析

​ 常说的GC(Garbage Collector) Roots,特指的是垃圾收集器(Garbage Collector)的对象,GC会收集那些不是GC Roots且没有被GC Roots引用的对象。

一个对象可以属于多个root,GC Roots有以下几种:

  • Class - 由系统类加载器(system class loader)加载的对象,这些类是不能够被回收的,他们可以以静态字段的方式保存持有其它对象。我们需要注意的一点就是,通过用户自定义的类加载器加载的类,除非相应的Java.lang.Class实例以其它的某种(或多种)方式成为roots,否则它们并不是roots,.
  • Thread - 活着的线程
  • Stack Local - Java方法的local变量或参数
  • JNI Local - JNI方法的local变量或参数
  • JNI Global - 全局JNI引用
  • Monitor Used - 用于同步的监控对象
  • Held by JVM - 用于JVM特殊目的由GC保留的对象,但实际上这个与JVM的实现是有关的。可能已知的一些类型是:系统类加载器、一些JVM知道的重要的异常类、一些用于处理异常的预分配对象以及一些自定义的类加载器等。然而,JVM并没有为这些对象提供其它的信息,因此需要去确定哪些是属于"JVM持有"的了。

2.GC算法

标记-清除 Mark-Sweep

​ 1.标记,从GC Root开始找,找出存活的对象

​ 2.清除,将没有标记的对象清除

​ 缺点是内存碎片太多

复制 Copy

​ 内存划分成两个区域,同一时间点只有一个是活动的,GC线程会将活动区域的存活对象全部复制到空闲区域,并对内存地址排序,新生代GC使用较多,缺点是浪费一般内存。

标记-整理 Mark-Compact

​ 1.标记

​ 2.整理,不直接对可回收对象进行清理,而是让所有可用的对象都向一端移动。然后直接清理掉边界以外的内存。

​ 在标记-清除的算法基础上,增加了清除后对内存地址的排序整理

分代

​ 根据堆中不同的区域使用不同的算法,新生代使用复制算法,老年代使用标记清楚/标记整理

相关文章:

JVM分享

JVM分享 官网:https://docs.oracle.com/javase/specs/jvms/se8/html/index.html Java代码的执行流程 我们编写完之后的java文件如果要运行,java文件会编译成class文件,在jvm中运行时ClassLoader会加载class文件,加载进来之后&a…...

Apache Dubbo CVE-2021-36162 挖掘过程

01 漏洞背景 发现该漏洞的起因是在分析 CVE-2021-30181 的脚本注入补丁的时候,意外发现了几个已被修复的 yaml 反序列化漏洞,还以为是未公开的Nday,查询后发现其实对应的是 CVE-2021-30180 漏洞的修复代码。通过查看补丁可以知道&#xff0c…...

开源框架面试题目整理

目录 SpringIOC SpringAOP Spring的生命周期 Spring Bean作用域 Spring Bean作用域并发安全 Spring循环依赖...

Mr. Cappuccino的第52杯咖啡——Mybatis环境搭建与使用

Mybatis环境搭建与使用 Mybatis介绍Mybatis环境搭建与使用基于XML方式-原生方式开发创建数据库表项目准备项目结构项目代码实体类中添加有参构造方法产生的问题 基于XML方式-mapper代理开发项目准备项目结构项目代码SQL映射文件中namespace未设置为接口全限定名产生的问题 基于…...

了解Unity编辑器之组件篇Tilemap(五)

Tilemap:用于创建和编辑2D网格地图的工具。Tilemap的主要作用是简化2D游戏中地图的创建、编辑和渲染过程。以下是一些Tilemap的主要用途: 2D地图绘制:Tilemap提供了一个可视化的编辑器界面,可以快速绘制2D地图,例如迷…...

Linux字符设备操作函数

Linux字符设备操作函数是指对字符设备进行打开、关闭、读取、写入、控制等基本操作的函数,它们通过字符设备结构体中的 file_operations 结构体来定义。常用的字符设备操作函数包括: 1、open: 当一个进程试图打开设备文件时,调用这个函数。开…...

吉林大学计算机软件考研经验贴

文章目录 简介政治英语数学专业课 简介 本人23考研,一战上岸吉林大学软件工程专硕,政治72分,英一71分,数二144分,专业课967综合146分,总分433分,上图: 如果学弟学妹需要专业课资料…...

2023-07-26力扣每日一题-区间翻转线段树

链接: 2569. 更新数组后处理求和查询 题意: 给两个等长数组nums1和nums2,三个操作: 操作1:将nums1的[l,r]翻转(0变1,1变0) 操作2:将nums2[any]变成nums2[any]nums1[any]*p&…...

Java设计模式之 -- 桥接模式

什么是桥接模式 桥接模式是一种结构型设计模式,也被称为“Handle/Body”。这种设计模式主要用于将抽象部分与它的实现部分分离,使它们可以独立地变化。这种方式有助于减少系统中的耦合性,增加了扩展性。 主要解决什么问题 桥接模式主要解决…...

【node.js】02-path模块

目录 1. path.join() 2. path.basename() 3. path.extname() 1. path.join() 使用 path.join() 方法,可以把多个路径片段拼接为完整的路径字符串,语法格式如下: path.join([...paths]) 例子: const path require(path)co…...

攻防世界-Reverse-re1

题目描述:菜鸡开始学习逆向工程,首先是最简单的题目 下载附件,执行程序,如下界面 1. 思路分析 没啥说的,既然题目都说是一道简单的逆向题,那么直接使用ida逆向即可,看逆向出的结果是否能写入到…...

AES加密的基本常识和封装类

AES加密的基本常识和封装类 AES(Advanced Encryption Standard)是一种对称密钥加密算法,被广泛用于保护敏感数据的安全性。它是一种块加密算法,意味着它将明文数据分成固定大小的块,并使用相同的密钥对每个块进行独立…...

elasticsearch使用记录

参考文章:https://elasticsearch-py.readthedocs.io/en/v8.8.2/ 参考文章:https://cuiqingcai.com/6214.html 参考文章:https://www.cnblogs.com/cupleo/p/13953890.html elasticsearch版本:8.8.2(软件包发行版) python版本&#…...

UNI-APP_横屏切换竖屏出现样式混乱问题

app从竖屏页面1进入竖屏页面2,再进入横屏,再返回,再返回从新回到竖屏页面1,再次进入竖屏页面2,发现竖屏页面2的所有图片字体都被放大了。再返回竖屏1,再进入竖屏2,一切又恢复正常。 解决跳转横…...

数据可视化(3)

1.饼状图 #饼状图 #pie(x,labels,colors,labeldistance,autopct,startangle,radius,center,textprops) #x,每一块饼状图的比例 #labels:每一块饼形图外侧显示的文字说明 #labeldistance:标记的绘制位置,相对于半径的比例&#xf…...

AI面试官:MD5、DES、RSA、AES加密

AI面试官:MD5、DES、RSA、AES加密 文章目录 AI面试官:MD5、DES、RSA、AES加密1. 什么是MD5加密?它在实际应用中有哪些场景?2. DES加密是什么?它在现实中的应用场景有哪些?3. 问题:RSA加密是什么…...

Shell脚本学习-$$特殊变量

$$特殊变量: 获取脚本执行的进程号(PID)。 [rootvm1 scripts]# cat test_pid.sh echo $$ > /tmp/a.pid sleep 300代码说明: 1)获取$$值,也就是当前脚本进程的PID值,重定向到/tmp/a.pid文件…...

vscode中python插件过新导致无法正常debug问题解决安装vscode以前版本python插件教程

您需要从.vsix文件安装它。您可以在此处找到它们。 下载所需.vsix版本的文件。您可能需要单击assets才能看到它们。 然后打开 VSCode,转到extensions-> 单击三个点 ->install from vsix并选择您的文件。 重启以后,就可以正常debug了!...

chrome macos编译

下载工具包 git clone https://chromium.googlesource.com/chromium/tools/depot_tools/gitpwd export PATH"$PATH:/Users/lichengjun/Downloads/chrome_build/depot_tools" mkdir chromium cd chromium 如果想快的话直接: fetch --nohooks --no-history chromium (…...

Linux环境下Elasticsearch相关软件安装

Linux环境下Elasticsearch相关软件安装 本文将介绍在linux(Centos7)环境下安装Elasticsearch相关的软件。 1、安装Elasticsearch 1.1 Elasticsearch下载 首先去Elasticsearch官网下载相应版本的安装包,下载之后传输到linux服务器上。 官网地址:http…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如&#xff1a…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

算术操作符与类型转换:从基础到精通

目录 前言:从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符:、-、*、/、% 赋值操作符:和复合赋值 单⽬操作符:、--、、- 前言:从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...

快速排序算法改进:随机快排-荷兰国旗划分详解

随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...

aardio 自动识别验证码输入

技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”,于是尝试整合图像识别与网页自动化技术,完成了这套模拟登录流程。核心思路是:截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...

【若依】框架项目部署笔记

参考【SpringBoot】【Vue】项目部署_no main manifest attribute, in springboot-0.0.1-sn-CSDN博客 多一个redis安装 准备工作: 压缩包下载:http://download.redis.io/releases 1. 上传压缩包,并进入压缩包所在目录,解压到目标…...