JVM调优介绍 + 面试题标准答案(高级)

一、JVM调优是什么?

JVM调优就是通过调整JVM参数、优化代码、优化内存使用,让Java应用GC更少、停顿更短、吞吐量更高、不宕机、不OOM。

主要解决:接口卡顿、Full GC频繁、内存溢出、服务崩溃等问题。

二、JVM内存结构(必背)

  1. 堆内存:存放对象,GC主要区域
  • 新生代:Eden + 2个Survivor

  • 老年代

  1. 非堆内存
  • 元空间 Metaspace(存放类信息)

  • 虚拟机栈、本地方法栈、程序计数器

一句话总结:

对象先在Eden创建,满了Minor GC;存活去Survivor,来回15次进老年代;老年代满了Full GC,会卡顿。

三、GC相关核心概念

  1. Minor GC:新生代回收,快、频繁、STW短

  2. Full GC:整堆回收,慢、卡顿严重,要尽量避免

  3. STW(Stop The World):GC时暂停所有业务线程,是卡顿根源

  4. 内存泄漏:对象不用了,但还被引用,GC收不回,最终OOM

下面是 10道高频面试题 + 标准答案

1.堆和栈的区别?

  • 堆:线程共享,存放对象,GC自动回收,空间大,存取慢。

  • 栈:线程私有,存放基本类型和引用,随方法进出自动释放,空间小,速度快。

2.Minor GC 和 Full GC 区别?

  • Minor GC:清理新生代,速度快,触发频繁,STW时间短。

  • Full GC:清理整个堆+元空间,速度慢,STW长,会造成服务卡顿,尽量避免。

3.哪些对象可以作为GC Root?

  • 虚拟机栈中引用的对象

  • 本地方法栈引用的对象

  • 类静态属性引用的对象

  • 常量引用的对象

  • 同步锁持有的对象

4.G1收集器原理?

G1把内存分成多个大小相等的Region,优先回收垃圾最多的区域,追求可控停顿。

它分新生代、老年代,但不固定位置,适合大内存、低延迟场景。

5.OOM内存溢出怎么排查?

  1. 先看错误日志,确认是堆溢出、元空间溢出还是栈溢出。

  2. 开启-XX:+HeapDumpOnOutOfMemoryError,生成dump文件。

  3. 用MAT、JProfiler分析大对象、内存泄漏。

  4. 检查缓存、集合、连接是否未关闭、静态变量是否过大。

6.为什么生产环境Xms和Xmx设为一样?

避免JVM在运行时动态扩容堆内存,扩容会引发性能波动、GC异常,所以生产必须相等。

7.对象如何从新生代进入老年代?

  1. 对象年龄达到15岁(默认)

  2. Survivor区放不下相同年龄的对象

  3. 大对象直接进入老年代

  4. 空间分配担保失败

8.Stop The World 是什么?

GC执行时,暂停所有用户线程,直到GC完成。

停顿期间服务不处理请求,会造成卡顿、超时。

9.元空间和永久代区别?

  • 永久代:在堆里,有固定大小,容易OOM。

  • 元空间:在本地内存,不受堆大小限制,JDK8以后替代永久代。

10.你做过哪些JVM调优?

项目中遇到Full GC频繁,我先通过jstat查看GC情况,发现老年代占用过高。

然后用jmap导出dump,分析出是大量短生命周期大对象提前进入老年代。

我做了几步优化:

  1. 将Xms和Xmx设为相同值,避免堆扩容

  2. 使用G1收集器,设置目标停顿200ms

  3. 调整大对象阈值,让对象优先在新生代分配

  4. 优化代码,减少大对象、清理无用缓存

最终Full GC从每小时多次降到每天一次,服务稳定不卡顿。

相关推荐
yaoxin5211231 分钟前
384. Java IO API - Java 文件复制工具:Copy 示例完整解析
java·开发语言·python
Greyson15 分钟前
Layui表格如何使用第三方插件实现树形展示.txt
jvm·数据库·python
2401_8716965216 分钟前
mysql行级锁失效的原因排查_检查查询条件与执行计划
jvm·数据库·python
我叫黑大帅18 分钟前
通过eino-ext如何正常indexer RAG?
后端·面试·go
NotFound48629 分钟前
实战指南如何实现Java Web 拦截机制:Filter 与 Interceptor 深度分享
java·开发语言·前端
a9511416421 小时前
CSS如何实现元素隐藏不占位_使用display-none完全移除
jvm·数据库·python
一 乐2 小时前
医院挂号|基于springboot + vue医院挂号管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·医院挂号管理系统
鱼鳞_2 小时前
Java学习笔记_Day29(异常)
java·笔记·学习
烟锁池塘柳02 小时前
一文讲透 C++ / Java 中方法重载(Overload)与方法重写(Override)在调用时机等方面的区别
java·c++·面向对象
一叶飘零_sweeeet2 小时前
深入拆解 Fork/Join 框架:核心原理、分治模型与参数调优实战
java·并发编程