JVM
2025/12/3大约 2 分钟
了解Java的双亲委派机制吗?
定义:
Java 类加载器在加载类时,先把请求交给父类加载器处理,如果父加载器无法加载,才由自己去加载。这就是“先父后子”的加载策略。
目的:
- 保证核心类一致性:避免核心类(如
java.lang.String)被重复加载。 - 防止类冲突:不同库中同名类不会覆盖核心类。
加载流程:
- 启动类加载器(Bootstrap ClassLoader):加载 JDK 核心类。
- 扩展类加载器(Extension ClassLoader):加载 JDK 扩展库类(
lib/ext)。 - 应用类加载器(AppClassLoader):加载应用类路径下的类。
- 自定义类加载器:先委托父加载器加载,父加载器失败后才自己加载。
示例:
public class ParentDelegationExample {
public static void main(String[] args) throws Exception {
ClassLoader cl = ClassLoader.getSystemClassLoader();
System.out.println(cl); // AppClassLoader
System.out.println(cl.getParent()); // ExtClassLoader
System.out.println(cl.getParent().getParent()); // BootstrapClassLoader (null)
}
}Java对象底层存储结构是什么?
Java 对象结构 = 16 字节对象头 + 实例数据(字段) + 对齐填充(填充到 8 字节倍数)。
- 对象头:存元信息(如锁状态、hashCode、类型指针等)
- 实例数据:类里面的字段真正存储的地方
- 对齐填充:为了让对象的大小变成 8 字节的整数倍,避免 CPU 访问异常
JVM GC(垃圾回收)有了解吗?
核心机制:
- 分代收集:堆分新生代(复制算法)+ 老年代(标记-整理/清除)
- 触发条件:Eden满→Minor GC(新生代GC,复制算法,停顿短),老年代满→Full GC
- STW:Stop-The-World暂停应用线程保证引用一致性
主流收集器:
- G1(JDK9+默认):区域化,可预测停顿
- ZGC:亚毫秒级停顿,TB级堆支持
- Parallel:吞吐量优先,后台批处理
调优口诀:Xms=Xmx防抖动,新生代占1/3,用G1/ZGC减停顿
JVM GC从入门到进阶:JVM GC 垃圾回收
JVM常用命令有哪些?
内存监控:jstat -gcutil <pid> 1000 看各代使用率
堆分析:jcmd <pid> GC.heap_dump file=heap.hprof 转储堆
线程诊断:jcmd <pid> Thread.print 打印线程栈
GC日志:-Xlog:gc*:file=gc.log(JDK9+统一日志)
参数速记:-X基础调优,-XX高级特性,-Xlog诊断日志
JVM常用命令:JVM参数与命令全攻略