JVM入门

一、为什么要学JVM?

JVM是Java代码和操作系统之间的"翻译官",学它的核心原因有三个:

  • 面试刚需:JVM是大厂面试高频考点,死记八股文不如理解底层逻辑。
  • 代码质量:知道代码在JVM中怎么执行,才能写出更可靠的系统(比如避免内存泄漏)。
  • 线上调优 :线上服务崩溃、内存溢出时,懂JVM才能快速定位问题(比如分析GC日志、调整内存参数)。
    简单说,学JVM是"一流程序员"和"只会CRUD的二流程序员"的分水岭。

二、JVM核心内容拆解

1. Class文件:JVM的"执行说明书"

Java代码编译后会生成.class文件,这是JVM能看懂的"二进制说明书"。

  • 结构特点 :以十六进制CAFEBABE开头(像Java的"身份证"),包含版本号、常量池(存类名、方法名等)、方法指令等。
  • 字节码指令 :Class文件里的代码是"机器指令",比如bipush 10(把10放入操作数栈)、invokestatic(调用静态方法)。看懂字节码能解释很多"诡异"问题,比如:
    • Integer缓存Integer i1=10; i1==i2true,是因为字节码调用了Integer.valueOf,它会缓存-128~127的数字。
    • try-catch-finally执行:字节码通过"异常表"控制流程,finally无论是否抛异常都会执行。

2. 类加载:把Class文件"搬进"JVM

类加载器负责把Class文件加载到JVM内存,核心机制有:

  • 双亲委派 :加载类时先"问爸爸"(父类加载器),爸爸加载不了才自己加载。好处是防止核心类(如java.lang.String)被篡改。
  • 沙箱保护 :禁止加载以java.开头的类,避免恶意代码冒充JDK核心类。
  • 类和对象的关系:类信息存在"元空间"(像库房,存模板),对象存在"堆"(像客厅,存具体数据),每个对象都有"类指针"指向元空间的类模板。

3. 执行引擎:把字节码变成"机器动作"

JVM通过两种方式执行字节码:

  • 解释执行:逐条翻译字节码为机器指令(像同声传译,慢但启动快)。
  • 编译执行(JIT) :把频繁执行的"热点代码"提前编译成机器码(像提前翻译演讲稿,快但启动慢)。
    HotSpot虚拟机(JDK默认)会混合使用两种方式,还会通过C1/C2编译器优化代码(C1快编译,C2优性能)。

4. GC垃圾回收:JVM的"清洁工"

Java不用手动释放内存,靠GC自动回收"无用对象",核心机制:

  • 分代收集模型 :按对象"寿命"分区域管理:
    • 年轻代(Eden区+2个Survivor区):放"朝生夕死"的对象(80%对象活不过一次GC),频繁回收(YoungGC)。
    • 老年代:放长期存活的对象,回收频率低(OldGC/FullGC)。
  • 垃圾回收器 :JDK8默认用Parallel Scavenge(注重吞吐量),还有G1(JDK9默认,低延迟)、ZGC(最新,超大规模内存)等。

三、JVM调优入门:从日志到分析

线上调优的核心是"看日志、调参数":

  • 定制GC参数 :通过-Xms(初始堆内存)、-Xmx(最大堆内存)等参数控制内存,用-XX:+PrintGCDetails打印GC日志。
  • 分析日志 :用工具(如gceasy.io)分析日志,能发现问题(如FullGC频繁、内存泄漏),再调整参数优化性能。

总结

JVM是Java的"底层引擎",理解它不仅能应对面试,更能让你写出高性能、高可靠的系统。学JVM虽有挑战,但掌握后会让你从"跟着做"变成"主动解决问题"的一流开发者。

相关推荐
名字还没想好☜9 小时前
Java 线上内存泄漏排查实战:jmap 导堆、MAT 找 GC Roots 与四类常见泄漏
java·开发语言·jvm·内存泄漏
淡海水16 小时前
01-07-运行时-GC深度剖析-内存分配回收与结构选择
jvm·windows·unity·gc
2602_9599609219 小时前
电商大厂Java面试:从Spring Boot、JPA、微服务到Redis、Kafka、Spring Security与监控,谢飞机的爆笑三轮问答
java·jvm·spring boot·redis·面试题
一水20 小时前
AI 时代审查思维:审查第一篇
java·jvm·数据库·spring
それども1 天前
JVM MetaspaceSize 参数作用
jvm
java_upp1 天前
JVM内存溢出和内存泄漏的区别及排查方法
jvm·内存泄漏·内存溢出
城管不管2 天前
MySQL 慢查询完整排查
java·服务器·jvm·数据库·mysql·spring·面试
mister_guo3 天前
JVM 内存管理原理及生产配置实战:从“参数能启动”到“内存可控”
java·jvm
名字还没想好☜4 天前
Go 的 strings.Builder 实战:拼接性能、Grow 预分配与何时该用 bytes.Buffer
java·jvm·后端·golang·go
wear工程师4 天前
Java 类初始化到底何时触发?别把加载、连接和 static 执行混在一起
java·jvm