一句话总结
JVM 是 Java 面试的深度考察点,核心考点:内存结构(堆/栈/方法区/元空间)、垃圾回收(算法+收集器选型)、类加载(双亲委派+打破场景)、调优实战(参数+日志分析)。每个知识点都有对应的深度解析文章。
内存模型
Q:JVM内存结构是怎样的?
JVM内存分为5个区域:
堆(Heap):存放对象实例,GC的主要区域。分为新生代(Eden + S0 + S1)和老年代。
方法区/元空间:存放类信息、常量、静态变量。JDK 8后移到本地内存的元空间。
虚拟机栈:每个线程私有,存放局部变量表、操作数栈、动态链接等。
本地方法栈:为Native方法服务。
程序计数器:当前线程执行的字节码行号指示器。
📖 深入阅读:JVM 内存结构详解 · 对象创建过程 · OOM 排查实战
垃圾回收
Q:常见的垃圾回收器有哪些?
新生代回收器:Serial、ParNew、Parallel Scavenge
老年代回收器:Serial Old、CMS、Parallel Old
整堆回收器:G1、ZGC、Shenandoah
G1回收器特点:基于Region的内存布局,支持设定最大停顿时间目标,适合大内存应用。JDK 9后成为默认回收器。
ZGC特点:着色指针+读屏障实现并发整理,停顿时间不超过10ms,适合超大堆内存。
类加载机制
Q:类加载的过程是什么?
类加载分为5个阶段:加载→验证→准备→解析→初始化。
双亲委派模型:类加载器收到请求时,先委派给父类加载器,只有父类无法完成时才自己加载。保证Java核心类的安全性。
打破双亲委派的场景:
1. SPI机制(JDBC)使用线程上下文类加载器
2. Tomcat每个Web应用独立的类加载器
3. OSGi模块化热部署
JVM调优实战
常见调优参数:
-Xms 初始堆大小,-Xmx 最大堆大小,生产环境通常设为相同值避免动态扩容。
-Xmn 新生代大小,-XX:NewRatio 新老年代比例。
-XX:+UseG1GC 使用G1回收器,-XX:MaxGCPauseMillis 最大停顿时间目标。
调优思路:先分析GC日志定位问题,再针对性调整。常见问题有频繁Full GC、内存泄漏、停顿时间过长。
📖 深入阅读:JVM 调优参数详解 · 逃逸分析