JVM相关面试题
JVM基础概念
运维必知
- 什么是JVM?为什么需要关注JVM?
- JVM内存主要分为堆内存和非堆内存,运维需要关注什么?
- 什么是GC?GC对应用性能有什么影响?
- 什么是STW(Stop The World)?如何监控STW时间?
- Full GC和Minor GC在监控中如何区分?
垃圾回收器
- 生产环境常用哪些垃圾回收器?(G1、CMS、ZGC)
- 不同垃圾回收器适用什么场景?
- 如何查看当前使用的垃圾回收器?
- GC频繁的常见原因有哪些?
JVM参数配置
内存参数
-Xms
和-Xmx
应该设置成什么关系?为什么?- 容器环境下JVM内存如何设置?(经验值:容器内存的50%-75%)
-XX:MaxMetaspaceSize
不设置会有什么风险?- 内存参数设置不当会导致什么问题?
GC参数
- 如何指定垃圾回收器?(
-XX:+UseG1GC
) -XX:MaxGCPauseMillis
参数的作用?- 如何开启GC日志?常用的GC日志参数有哪些?
-Xloggc:/var/log/app/gc.log
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails
诊断参数
- OOM时如何自动导出堆转储文件?
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/var/log/app/
- 如何开启JMX监控?需要哪些参数?
容器化与K8s问题
容器化配置
- Java应用容器化时JVM参数如何设置?
- 容器内存限制与JVM堆内存的关系?
- 为什么Java 8在容器中会出现内存问题?
-XX:MaxRAMPercentage
参数的作用?
K8s环境问题
- Java应用在K8s中OOM被杀如何保留现场?
- 如何配置优雅停机(Graceful Shutdown)?
- 如何避免JVM内存与K8s容器内存不一致导致的OOMKilled?
- Pod重启后如何保留堆转储文件?(使用PVC挂载)
容器化最佳实践
- Docker镜像中JDK版本选择建议?(JDK 8u191+或JDK 11+)
- 如何在容器中设置时区?
- 容器中如何处理随机数生成慢的问题?(
-Djava.security.egd
)
故障排查
CPU问题排查
- Java进程CPU占用100%如何快速定位?
- 使用top命令如何找到占用CPU最高的Java进程?
- CPU占用高但GC正常,可能是什么原因?
内存问题排查
- Java进程内存持续增长如何排查?
- 如何判断是内存泄漏还是正常的内存使用?
- OOM错误有哪几种类型?分别代表什么问题?
- 容器中Java进程被OOMKilled如何分析原因?
常用排查命令
jstat -gcutil
输出的各列含义?- 如何使用
jmap
命令查看内存占用TOP对象? - 生产环境能否使用
jmap -histo:live
?有什么风险?
监控方案
JVM监控
- 如何部署JMX Exporter?需要开放哪些端口?
- Prometheus监控JVM最重要的5个指标是什么?
- GC监控中Young GC和Old GC频率多少算正常?
监控告警
- JVM哪些指标超过阈值需要立即处理?
- 如何设置合理的JVM告警阈值?
- 夜间告警和白天告警策略有什么不同?
APM集成
- Java Agent对应用性能有多大影响?
- 如何在不重启应用的情况下加载Agent?
性能调优
JVM调优
- 什么情况下需要进行JVM调优?
- JVM调优前需要收集哪些数据?
- 调优后如何验证效果?
调优案例
- GC时间过长如何优化?
- 应用启动慢如何排查?
- 响应时间突然变慢可能是什么原因?
日常运维
部署配置
- JDK安装后如何验证是否正常?
- Java应用启动失败的常见原因?
- 如何配置Java应用的系统服务(systemd)?
日志管理
- GC日志文件过大如何处理?
- 如何配置GC日志自动轮转?
- 容器环境下日志应该输出到哪里?
版本升级
- JDK版本升级的标准流程是什么?
- 如何快速回滚JDK版本?
- 不同JDK版本的性能差异主要在哪?
最佳实践
应急处理
- Java应用突然无响应如何处理?
- 生产环境Java进程能否直接kill -9?
- 如何在不影响业务的情况下收集故障信息?
经验总结
- Java应用运维中最容易忽视的问题是什么?
- 如何建立Java应用的运维基线?
- 运维Java应用需要掌握哪些Linux命令?
更新时间:2025-01-30