JVM解析

张开发
2026/4/16 18:49:49 15 分钟阅读

分享文章

JVM解析
文章目录JVM概述工作流程生成.Class文件类加载模块对象执行GC垃圾回收nonheap 非堆区heap 堆区JVM概述JVM java虚拟机运行.class文件将字节码翻译成各操作系统可以看懂的指令从而实现java/其他语言 可以跨平台运行一次编写到处运行工作流程生成.Class文件相当于把java代码一步步拆解生成一份清单变量需要的内存空间指令执行的逻辑顺序…上图为.class文件的内容十六进制的表达方式以二进制文件格式进行存储用 ByteCodeView 插件打开上图.class是一份给JVM使用的”指令说明书“类的基本信息实现了哪些接口有哪些父类常量池字段信息成员变量类型修饰符方法信息局部变量表需要多大的槽位操作数栈最大深度方法参数返回值类型方法中的指令执行流程:如下图异常语句的执行逻辑类加载模块将硬盘里的.Class字节码文件加载至JVM管理的元空间中类加载器对加载过的类有一个缓存双亲委派机制加载类之前会先判断父类是否有加载过若有则返回若无则自行加载安全如果你写一个java的同名核心类里面添加恶意代码如果没有双亲委派就会直接加载性能已经加载过的类无需重复加载节约资源沙箱保护机制(下图)为了安全的二重保险不允许加载java.开头的自己写的类(所以有的类是javax开头)。(防止双亲委派机制被破环后恶意覆盖java的核心类)对象类被加载后需要创建对象类在元空间(类似仓库存储对象在堆中存储堆中每个对象的头部保存了对应的类指针指向元空间的类对象.getClass();执行解释执行”同声传译“JVM收到一条指令翻译一条编译执行“提前翻译”用户代码执行中的热点代码形成CodeCache放入元空间后续可以直接执行GC垃圾回收执行时class文件在JVM的内存中运行该过程需要不断地创建销毁对象为了防止内存泄露使用GC垃圾回收器进行管理阿里开源的Arthas(下图)记录JVM的内存使用情况nonheap 非堆区热点指令缓存(提前编译好的热点指令)元空间(类的存放位置)压缩类空间heap 堆区大小由 -Xms -Xmx参数进行设置如果内存最大还是不够用就会产生内存溢出(OOM);堆中分为年轻代与老年代两个区域年轻代快速创建与销毁的对象在年轻代存储GC管理器对其进行频繁的回收根据不同的GC次数放进不同的survivor迭代区直到迭代至16被移动至老年代老年代GC频率低当空间不够用了才会进行GCGC了也腾不出太大的空间

更多文章