interview jvm
list
-
运行时数据区
-
类加载机制
-
垃圾回收
-
虚拟机对象探秘
-
调优
-
生产排查
1. 运行时数据区
- 程序计数器
- Java虚拟机栈
- 本地方法栈
- Java堆
- 方法区
- 运行时常量池
- 直接内存
2. 类加载机制
- 四种类加载器:启动类加载器、扩展类加载器、应用类加载器、自定义类加载器
- 类加载执行过程:加载、连接(验证 准备 解析)、初始化、使用、卸载
- 双亲委派模型
- 破坏双亲委派
- 原因:父类加载器需要委托子类加载器去加载class文件
- 示例:Driver,定义在JDK,由启动类加载器加载,而数据库厂商的驱动,由应用类加载器加载
3. 垃圾回收
- 四种引用类型:强引用、软引用、弱引用、虚引用
- 可回收对象判定:引用计数、可达性分析
- 垃圾收集算法:标记-清除算法、标记-复制算法、标记-整理算法、分代算法
- 垃圾收集器:
- 新生代:Serial、ParNew、Parallel Scavenge
- 老年代:Serial Old、Parallel Old、CMS
- 新+老:G1、ZGC
- 两种GC
- Minio GC:发生在新生代的GC,特点是发生频繁、回收速度快,
- Full GC:发生在老年代的GC
垃圾收集器
垃圾收集器 | 新老年代&算法 | 多线程 | 特点 |
---|---|---|---|
Serial | 新,标记-复制 | ||
Serial Old | 老,标记-整理 | ||
ParNew | 新,标记-复制 | 多 | |
Parallel Scavenge | 新,标记-复制 | 多 | 吞吐 |
Parallel Old | 老,标记-整理 | 多 | 吞吐 |
CMS | 老,标记-清除 | 多 | 最短停顿/低延迟 浮动垃圾 内存碎片 |
G1 | 新+老,整体看“标记整理”,局部看“标记复制” | 多 | region 可预测停顿 |
CMS:初始标记、并发标记、重新标记、并发清除。其中1和3需要STW
G1:初始标记、并发标记、最终标记、筛选回收。4筛选,是选择一些region,取决于用户设置的停顿时间
4. 虚拟机对象探秘
-
创建方式:new、Class.newInstance、Constructor.newInstance、clone、反序列化
-
创建过程:类检查或类加载、分配内存、对象实例部分设为零值、设置对象头、执行init方法
-
分配内存方式:指针碰撞、空闲列表
- 并发安全:CAS加重试重试、本地线程缓冲TLAB
-
内存布局:对象头、实例数据、对齐填充个
-
访问定位:直接指针、句柄
-
内存分配策略
- 对象优先分配在Eden区
- 大对象直接进入老年代
- 长期存活的对象进入老年代
- 动态判断对象年龄
- 空间分配担保
5. 调优
瓶颈:堆内存到阈值、full gc频繁、gc停顿时间过长、OOM…
目标:吞吐量、延迟、内存占用
调优命令:jps、jstat、jmap、jhat、jstack、jinfo、jconsole、jvisualvm
调优工具:arthas、MAT、CGhisto、JProfiler
6. 生产排查
CPU 100%排查
步骤:top定位进程、top -pH定位线程、jstack查看线程信息、根据线程栈定位代码
预约:死循环、频繁GC
内存泄漏排查
生产配置:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof
步骤:top定位进程、jmap生成内存快照、分析dump文件
接口响应慢
体现:体验、监控系统报警
类型:个别接口、所有接口响应慢
个别接口慢:shywalking、arthas
- sql慢
- 调第三方接口慢
所有接口慢:服务器问题(网络、CPU、内存、磁盘、GC、高并发等)
refer
https://www.cxyxiaowu.com/16162.html
https://blog.csdn.net/ThinkWon/article/details/104390752
https://www.cnblogs.com/aspirant/p/8662690.html
https://www.modb.pro/db/66232
https://zhuanlan.zhihu.com/p/363961261