JVM极简教程

本文详细阐述了JVM的跨平台原理,包括字节码执行过程、编译与解释的区别,以及Java类加载机制、类加载器、运行时数据区(如堆、方法区)和垃圾回收策略(如分代收集、G1和ZGC)。

JVM跨平台原理

由于不同平台下载不同的JVM,字节码基于JVM进行运行,java代码编译成字节码文件后,在不同的平台进行运行。

                    编译                        解释

Java代码   ————>  字节码 ————>机器指令

JVM语言

Java、Groovy、Scala、Kotlin、JRuby

JVM整体结构

运行时数据区:本地方法栈、java方法栈、方法区、堆、程序计数器

执行引擎:解释器、JIT编译器、GC

类加载子系统

加载

链接:验证、准备、解析

类加载器的分类

引导类加载器 BootStrapClassLoader

自定义类加载器继承实现ClassLoader:ExtClassLoader、AppClassloader、WebAppClassLoader

类加载器默认加载目录

classpath

双亲委派

java代码里定义一个加载器,使用加载器的父加载器, 使用父类加载器先行加载

Tomcat为什么要自定义类加载器

应用a和应用b存在相同的类,为了实现类加载的隔离,每个应用都有一个WebappClassLoader

JVM 在确定类是否加载时根据 类名 + 类加载器

运行时数据区

方法区:常量池、方法信息、类信息

堆:新生代、老年代

java方法栈:栈帧:局部变量表、操作数栈、动态链接、方法返回地址

本地方法栈

程序计数器

程序计数器

PC Register 程序寄存器 又称程序计数器

1.是物理寄存器的抽象实现

2.用来记录待执行的下一条指令的地址

3.它是程序控制流的指示器,循环、if else、异常处理、线程恢复等都依赖它来完成

4.解释器工作时是通过它来获取下一条需要执行的字节码指令的

5.它是唯一一个在JVM规范中没有规范任何OutOfMemoryError情况的区域

虚拟机栈(Java栈、Java方法栈)

虚拟机栈不需要GC处理,它会随着线程的完成而消失,StackOverflowError会在方法调用层数过多的情况下报错,OutOfMemoryError线程太多,没有足够的内存去创建虚拟机栈

栈帧

局部变量:定义的一个一个变量

操作数栈:数据会在此处处理

本地方法栈

本地方法:native method ,在Java中定义的方法,但由其他语言实现

新生代 8 :1 : 1 eden区 s0区 s1区

老年代

不会立马回收,需要等java后台执行GC后被回收

-Xms 堆初始化内存大小

-Xmx 堆的最大内存大小

一般会把-Xms和-Xmx设置会一样,提高了效率,默认情况下,初始化内存最小 = 物理内存大小/64 初始化内存最大 = 物理内存大小/4

Eden区 ——触发YGC——> S0(记录次数)—触发YGC—>S1区(记录次数)

S0和S1区反复移动,超出一定清理次数后放置老年代,或者s0、s1区放置不下 直接放置老年代

Young GC 负责新生代进行垃圾处理

Old GC 负责老年代进行垃圾处理

Full GC 整堆回收

为什么要进行垃圾回收

垃圾是指JVM中没有任何引用对象被回收

引用计数法

每个对象都保存一个引用计数器属性

实现简单,计数器为0则表示为垃圾对象

缺点:需要额外的空间、需要额外时间维护引用计数、对象嵌套引用

可达性分析法

以GC Root为起始点,层层查询引用对象,如果存在为有用对象,如果不是即为垃圾对象

标记-清除(Mark-Sweep)算法

基础、常用的垃圾回收算法,内存空间不够用,会暂停用户线程执行,然后执行算法进行垃圾回收

1.标记阶段:GC Root开始遍历,找到可达对象,并对对象头中进行记录

2.清除阶段:堆内存空间进行线性遍历

缺点:效率不高、内存碎片

优点:思路简单

复制(Copying)算法

空间换时间,可达内存放置复制出来的空白内存空间中

优点:没有标记和清除阶段、不会出现内存碎片

缺点:需要更多内存、内存地址改变,栈帧记录引用需要时间修改

标记-整理(Mark-Compact)算法

第一阶段:查询到可达对象

第二阶段:把所有存活对象移动到内存的一端

优点:不需要额外空间、不会有内存碎片

缺点:栈帧引用记录修改、用时较慢

分代收集算法

新生代存活时间较短 复制算法

老年代存活时间较长 标记清除算法、标记整理算法

垃圾回收器

Serial GC 串行 工作线程暂停 一个线程垃圾回收

Serial Old GC 串行

ParNew GC 并行

CMS GC 并行 用户线程、垃圾回收线程同时进行 暂停时间更少了 用户体验会更好 吞吐量变低了 单位时间内,可执行的用户线程变低了

Parallel GC 并行  工作线程暂停 多个线程垃圾回收

Paraller Old GC 并行高发

G1 并行 用户线程、垃圾回收线程同时进行

ZGC 并行 用户线程、垃圾回收线程同时进行

CMS问题总结

在并发标记 垃圾回收线程跟不上用户线程速度 使用 Serial Old

在并发清理 产生一些新的垃圾 这些被称为浮动垃圾 需要等下次 GC处理

标记-清除 可以使用参数控制多少次标记清除后进行整理

G1垃圾处理器(Garbage-Frirst)

2048的region,堆内存/2048,逻辑连续的Eden区、S0区、S1区、老年区

可以设置默认STW时间

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值