JVM调优命令——jmap

JVM调优最重要的是通过分析dump文件。dump文件有两种,一种是heap dump文件,另一种是thread dump文件。heap dump文件是某一时刻JVM堆存储的快照,是一种镜像文件,用来记录某一时刻内存信息,包括内存的占用,使用率以及GC方式等。而thread dump是记录某一时刻cpu信息,主要是线程的执行情况等,例如某一时刻线程执行到哪个类的哪个方法上了。heap dump文件是需要利用命令jhat去分析的,而thread dump是文本文件,可以直接查看。

拿到heap dump文件的方式有两种。一种是给JVM设置启动参数 XX:+HeapDumpOnOutOfMemoryError,这样JVM在出现OOM的时候会自动生成heap dump文件。而另一种就是使用jmap命令了。这里主要总结一下jmap命令的用法。

jmap命令不仅可以用来生成heap dump文件,还可以用来直接查询finalize执行队列,堆内存的使用率以及GC方式等。

jmap命令格式为:   jmap [option]

option为参数,参数不同,功能也不同。option主要有:

1.heap      显示java堆详细信息。

2.histo      显示堆中对象的统计信息。

3.permstat      堆中永久代中类的统计信息,由于JDK1.8之后取消的永久代,所以该参数在之后的JDK版本中无效。

4.finalizerinfo      显示finalize队列的执行情况。

5.dump      生成堆存储快照,即heap dump文件。

6.F      当 -dump参数没有响应时,强制生成dump快照。

主要用法示例:

 

<think>嗯,用户想要JVM相关的面试题和经验总结,目标是18K级别的Java岗位。从引用内容看,18K属于中级开发岗,需要扎实的JVM功底和实战能力[^5]。 用户可能正在准备面试,需要系统性的知识梳理。引用[3][4]提到JVM是Java面试核心考点,包括内存结构、垃圾回收、性能监控等。引用[5]特别强18K薪资需要突破CRUD层面,要能解决高并发场景下的性能问题。 我注意到用户提供的引用中有几个关键点需要覆盖: 第一,必须包含基础概念题(如内存区域划分、GC算法原理),这是面试必问[^3]。 第二,要突出实战经验(如参数配置、OOM排查),引用[4][5]显示这是区分普通开发和中级开发的关键。 第三,需补充性能压测和监控工具链的使用,引用[4]明确提到这是高频考点。 关于面试经验部分,引用[5]的案例很有参考价值——仅会SSM框架达不到18K水准,必须能说清楚对业务的影响。因此我在回答中加入了“目标”和“业务场景结合”的建议。 最后决定分三块组织内容: 1. 基础理论题覆盖JVM核心机制,用$$公式展示内存计算过程 2. 实战操作题强工具使用和问题排查逻辑 3. 经验总结部分直接关联薪资要求,给出学习路径建议 这样既符合系统指令的格式要求,也能解决用户的实际需求。特别在内存计算部分用了独立公式块,避免行内公式过于拥挤。</think>### JVM常见面试题及18K级别经验总结 以下问题结合高频考点与18K+岗位能力要求整理,涵盖理论、实战和深度化场景: --- #### **一、基础理论题** 1. **JVM内存结构划分** - 描述堆、方法区、虚拟机栈、本地方法栈、程序计数器的作用,重点说明**堆内存分代设计**(Eden/Survivor/Old)和**元空间替代永久代**的原因[^3][^4]。 - *进阶*:`-Xmx`、`-Xms`、`-XX:MetaspaceSize`参数如何影响内存分配? 2. **垃圾回收算法与实现** - 对比标记-清除、复制、标记-整理算法的缺点,**CMS与G1回收器的核心区别**是什么? - *场景题*:高并发低延迟系统应选哪种GC?大堆内存(>32G)场景如何选择?[^3][^4] 3. **GC日志分析与指标** - 如何通过 `-XX:+PrintGCDetails` 日志判断Young GC/Full GC频率?**Stop-The-World时间过长**的可能原因有哪些? - *关键指标*:`吞吐量` > 95%,`GC停顿` < 200ms(参考值)[^4]。 --- #### **二、实战题** 4. **OOM问题排查** - **堆溢出**(`java.lang.OutOfMemoryError: Java heap space`): - 使用 `jmap -dump:format=b,file=heap.bin <pid>` 导出堆快照,通过MAT分析**内存泄漏对象**。 - **元空间溢出**(`Metaspace`): - 检查动态生成类(如CGLib代理)或未卸载的类加载器[^4]。 5. **性能参数** - **年轻代化**:`-XX:NewRatio`(老年代/年轻代比例)、`-XX:SurvivorRatio`(Eden/Survivor比例) - **G1**:`-XX:MaxGCPauseMillis`(目标停顿时间)、`-XX:InitiatingHeapOccupancyPercent`(触发混合GC阈值) - *案例*:频繁Full GC时,增大`-XX:NewSize`或降低`-XX:MaxTenuringThreshold`(晋升年龄阈值)[^4]。 6. **监控工具链运用** - `jstat -gcutil <pid>` 实时查看GC统计 - `jstack <pid>` 分析线程死锁或阻塞 - **Arthas在线诊断**:`watch`方法参数、`heapdump`导出内存快照[^4]。 --- #### **三、高阶深度题(18K+核心考察点)** 7. **与业务场景结合** - 电商大促时,如何通过**预扩容堆内存** + **G1分区策略**应对瞬时流量? - 描述一次**减少Full GC频率**的实际案例(需包含原始问题、分析过程、参数整、效果验证)。 8. **JIT编译化** - 解释**方法内联**(`-XX:+Inline`)、**逃逸分析**如何提升性能,`-XX:+PrintCompilation`日志解读[^4]。 9. **容器化环境** - Docker中如何避免**内存超卖**导致OOM Killer?`-XX:+UseContainerSupport`参数的作用是什么? --- ### 💡 18K级别面试经验总结 1. **目标清晰化** - 明确化指标(吞吐量、延迟、资源消耗),避免盲目整参数。例如:“通过增大新生代降低Young GC频率,将TP99从500ms降至200ms”。 2. **证明实战能力** - 准备1-2个**复杂案例**: - 问题现象(如CPU飙升、服务卡顿) - 工具使用(Arthas/jstat/火焰图) - 根因分析(线程阻塞/内存泄漏) - 解决效果(量化指标提升)[^4][^5] 3. **知识深度展示** - 对比ZGC/Shenandoah等新GC器的**三色标记算法**,说明其低延迟原理。 - 掌握**JMM内存模型**(Happens-Before原则)对并发程序的影响[^3][^4]。 > 📌 **避坑提示**:18K+岗位忌仅背八股文。面试官常追问:“你在中**最大的教训**是什么?” 需体现反思能力(如误判GC类型导致服务抖动)[^5]。 --- #### 附:参数速查表 | 场景 | 关键参数 | |---------------------|------------------------------------------| | 堆内存溢出 | `-XX:+HeapDumpOnOutOfMemoryError` | | CMS并发失败 | `-XX:+UseCMSInitiatingOccupancyOnly` | | G1混合GC触发 | `-XX:InitiatingHeapOccupancyPercent=45` | | 元空间监控 | `-XX:NativeMemoryTracking=summary` | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值