跳到主要内容

JVM相关面试题

JVM基础概念

运维必知

  1. 什么是JVM?为什么需要关注JVM?
  2. JVM内存主要分为堆内存和非堆内存,运维需要关注什么?
  3. 什么是GC?GC对应用性能有什么影响?
  4. 什么是STW(Stop The World)?如何监控STW时间?
  5. Full GC和Minor GC在监控中如何区分?

垃圾回收器

  1. 生产环境常用哪些垃圾回收器?(G1、CMS、ZGC)
  2. 不同垃圾回收器适用什么场景?
  3. 如何查看当前使用的垃圾回收器?
  4. GC频繁的常见原因有哪些?

JVM参数配置

内存参数

  1. -Xms-Xmx应该设置成什么关系?为什么?
  2. 容器环境下JVM内存如何设置?(经验值:容器内存的50%-75%)
  3. -XX:MaxMetaspaceSize不设置会有什么风险?
  4. 内存参数设置不当会导致什么问题?

GC参数

  1. 如何指定垃圾回收器?(-XX:+UseG1GC
  2. -XX:MaxGCPauseMillis参数的作用?
  3. 如何开启GC日志?常用的GC日志参数有哪些?
-Xloggc:/var/log/app/gc.log
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails

诊断参数

  1. OOM时如何自动导出堆转储文件?
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/var/log/app/
  1. 如何开启JMX监控?需要哪些参数?

容器化与K8s问题

容器化配置

  1. Java应用容器化时JVM参数如何设置?
  2. 容器内存限制与JVM堆内存的关系?
  3. 为什么Java 8在容器中会出现内存问题?
  4. -XX:MaxRAMPercentage参数的作用?

K8s环境问题

  1. Java应用在K8s中OOM被杀如何保留现场?
  2. 如何配置优雅停机(Graceful Shutdown)?
  3. 如何避免JVM内存与K8s容器内存不一致导致的OOMKilled?
  4. Pod重启后如何保留堆转储文件?(使用PVC挂载)

容器化最佳实践

  1. Docker镜像中JDK版本选择建议?(JDK 8u191+或JDK 11+)
  2. 如何在容器中设置时区?
  3. 容器中如何处理随机数生成慢的问题?(-Djava.security.egd

故障排查

CPU问题排查

  1. Java进程CPU占用100%如何快速定位?
  2. 使用top命令如何找到占用CPU最高的Java进程?
  3. CPU占用高但GC正常,可能是什么原因?

内存问题排查

  1. Java进程内存持续增长如何排查?
  2. 如何判断是内存泄漏还是正常的内存使用?
  3. OOM错误有哪几种类型?分别代表什么问题?
  4. 容器中Java进程被OOMKilled如何分析原因?

常用排查命令

  1. jstat -gcutil输出的各列含义?
  2. 如何使用jmap命令查看内存占用TOP对象?
  3. 生产环境能否使用jmap -histo:live?有什么风险?

监控方案

JVM监控

  1. 如何部署JMX Exporter?需要开放哪些端口?
  2. Prometheus监控JVM最重要的5个指标是什么?
  3. GC监控中Young GC和Old GC频率多少算正常?

监控告警

  1. JVM哪些指标超过阈值需要立即处理?
  2. 如何设置合理的JVM告警阈值?
  3. 夜间告警和白天告警策略有什么不同?

APM集成

  1. Java Agent对应用性能有多大影响?
  2. 如何在不重启应用的情况下加载Agent?

性能调优

JVM调优

  1. 什么情况下需要进行JVM调优?
  2. JVM调优前需要收集哪些数据?
  3. 调优后如何验证效果?

调优案例

  1. GC时间过长如何优化?
  2. 应用启动慢如何排查?
  3. 响应时间突然变慢可能是什么原因?

日常运维

部署配置

  1. JDK安装后如何验证是否正常?
  2. Java应用启动失败的常见原因?
  3. 如何配置Java应用的系统服务(systemd)?

日志管理

  1. GC日志文件过大如何处理?
  2. 如何配置GC日志自动轮转?
  3. 容器环境下日志应该输出到哪里?

版本升级

  1. JDK版本升级的标准流程是什么?
  2. 如何快速回滚JDK版本?
  3. 不同JDK版本的性能差异主要在哪?

最佳实践

应急处理

  1. Java应用突然无响应如何处理?
  2. 生产环境Java进程能否直接kill -9?
  3. 如何在不影响业务的情况下收集故障信息?

经验总结

  1. Java应用运维中最容易忽视的问题是什么?
  2. 如何建立Java应用的运维基线?
  3. 运维Java应用需要掌握哪些Linux命令?

更新时间:2025-01-30