📌PDF:大白话说Java面试题 — 02-JVM篇
第23题:工作中用过的JVM常用基本配置参数有哪些
📚回答:
- 核心考点:
大厂面试不仅要列出参数,还要说明调优理由和常见陷阱。以下按内存区域分类。
1. 堆内存(最常调)
| 参数 | 含义 | 生产建议 | 反例陷阱 |
|---|---|---|---|
-Xms | 初始堆大小 | 与-Xmx一致,避免动态扩容 | 设置过小 → 频繁扩容停顿 |
-Xmx | 最大堆大小 | 物理内存的50%~70%(容器内需留25%给OS) | 设置过大 → GC停顿长 + 容器OOM kill |
-Xmn | 年轻代大小 | 堆的1/3 ~ 1/4 | 固定值可能导致老年代太小 |
-XX:NewRatio | 老年代/年轻代比例 | -XX:NewRatio=2(年轻代1/3) | 与-Xmn同时使用时,-Xmn优先 |
-XX:SurvivorRatio | Eden/Survivor比例 | -XX:SurvivorRatio=8(Eden 8,S0和S1各1) | 设置过小 → 动态年龄过早晋升 |
示例(8GB堆,G1):
-Xms8g-Xmx8g-XX:MaxGCPauseMillis=200注:G1不推荐用-Xmn,改用-XX:MaxGCPauseMillis自适应。
2. 非堆内存(常被忽略)
| 参数 | 含义 | 生产建议 | 常见问题 |
|---|---|---|---|
-Xss | 线程栈大小 | Linux 64位默认1MB,可减至512KB(1000线程省500MB) | 设置太小 →StackOverflowError(递归/深度调用) |
-XX:MetaspaceSize | 元空间触发Full GC的阈值 | 设为128m~256m | 默认21M太小 → 频繁Full GC |
-XX:MaxMetaspaceSize | 元空间最大大小 | 256m~512m(类加载多的应用如Spring Boot需更大) | 不设可能无上限吃满内存 |
-XX:MaxDirectMemorySize | 直接内存(NIO) | 默认等于-Xmx,建议显式设(如256m) | 不设导致OutOfMemoryError: Direct buffer memory |
3. 垃圾回收相关(选型关键)
| 参数 | 含义 | 场景 |
|---|---|---|
-XX:+UseG1GC | 启用G1 | JDK 9+默认,4GB+堆 |
-XX:+UseParallelGC | 启用Parallel | JDK 8默认,吞吐优先(批处理) |
-XX:MaxGCPauseMillis | G1目标停顿时间(毫秒) | 设100~200ms,不要低于50ms |
-XX:G1HeapRegionSize | G1区块大小(默认自动) | 若手动设,为1/2/4/8/16/32MB |
-XX:ParallelGCThreads | GC并行线程数 | 默认CPU数的5/8,容器内需手动设<=CPU核数 |
4. OOM与调试(救命参数)
-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=/path/to/dump.hprof-XX:OnOutOfMemoryError="kill -9 %p"HeapDumpOnOutOfMemoryError:OOM时自动dump堆(必备)OnOutOfMemoryError:OOM时执行脚本(如重启)
5. 典型生产配置示例(8核32G,G1)
java-Xms16g-Xmx16g\-XX:+UseG1GC\-XX:MaxGCPauseMillis=150\-XX:ParallelGCThreads=8\-Xss512k\-XX:MetaspaceSize=256m\-XX:MaxMetaspaceSize=512m\-XX:MaxDirectMemorySize=256m\-XX:+HeapDumpOnOutOfMemoryError\-XX:HeapDumpPath=/data/logs/dump.hprof\-jarapp.jar6. 大厂面试追问
Q1:-Xms和-Xmx设一样,堆就不会扩容了吗?
A:堆容量物理上不变,但内部Eden/Survivor比例仍会动态调整(如自适应大小策略)。G1下Region分配也会动态。
Q2:容器内如何设-Xmx?
A:应留25%左右给OS+堆外。设-Xmx=容器内存*0.7,或用-XX:MaxRAMPercentage=70.0(JDK 8u191+)。
Q3:-Xss设多大安全?
A:大部分应用256k~512k足够。若用大量递归/深度调用栈(如JSON解析深度嵌套),保留默认1M。
Q4:Metaspace设置太小会怎样?
A:频繁触发Full GC(Metadata GC Threshold),导致吞吐下降。线上观察到大量Metadata GC Threshold应调大MetaspaceSize。
💡面试官想要的满分总结:
“常用参数分四类:堆大小(-Xms/-Xmx)、线程栈(-Xss)、元空间(MetaspaceSize/MaxMetaspaceSize)、GC选型与调优(UseG1GC/MaxGCPauseMillis)。
生产必须配置:-Xms=-Xmx、-XX:+HeapDumpOnOOM、合理设MetaspaceSize避免频繁Full GC。
容器环境需额外注意MaxRAMPercentage和ParallelGCThreads不能超过CPU核数。”
觉得对您有帮助,麻烦点点关注啦,您的关注是我创作的最大动力~ 🎯