面试实战题-JVM调优

JVM

可达性分析

在Java中,可作为GC Root的对象包括以下几种:

● 虚拟机栈(栈帧中的本地变量表)中引用的对象

● 方法区中类静态属性引用的对象

● 方法区中常量引用的对象

● 本地方法栈中JNI(即一般说的Native方法)引用的对象

可达性算法、Java引用 详解 - 简书

内存模型,程序计数器的作用

1. 程序计数器 2. Java虚拟机栈 3. 本地方法栈 4. 堆 5. 方法区。

程序计数器的作用:

1、字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制,如:顺序执行、选择、循环、异常处理。

2、在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行到哪儿了。 

JVM学习笔记-JVM内存模型

MetaSpace介绍

在永久代移除后,字符串常量池也不再放在永久代了,但是也没有放到新的方法区---元空间里,而是留在了堆里(为了方便回收)。运行时常量池随着搬家到了元空间里,毕竟它是装类的重要等信息的,有它的地方才称得上是方法区。

https://segmentfault.com/a/1190000012577387

https://www.cnblogs.com/shen-qian/p/11277085.html 

类加载机制和过程

加载 链 接(验证准备解析) 初始化

某个特定的类加载器接收到类加载的请求时,会将加载任务委托给自己的父类,直到最高级父类引导类加载器(bootstrap class loader),如果父类能够加载就加载,不能加载则返回到子类进行加载。如果都不能加载则报错。ClassNotFoundException

【Java基础】类加载过程 - 简书

怎么判断一个类应该被哪个类加载器加载

TODO

https://www.cnblogs.com/KingIceMou/p/7208336.html

垃圾回收

回收死亡对象的内存共有三种方式,分别为:会造成内存碎片的清除、性能开销较大的压缩、以及堆使用效率较低的复制。

JVM | 垃圾回收(上)

https://mp.weixin.qq.com/s?__biz=MzU0NTczODMwMw==&mid=2247484164&idx=3&sn=911113846115de7c8d01222896adb259&chksm=fb691854cc1e914298648d08d8ab5fa6754c8f2716eea3a0b9b7ec7be6769d856feec5bc339e&token=1282690993&lang=zh_CN#rd

垃圾收集器

G1的内存模型

G1垃圾收集器没有新生代和老年代的概念了,而是将堆划分为一块块独立的Region。当要进行垃圾收集时,首先估计每个Region中的垃圾数量,每次都从垃圾回收价值最大的Region开始回收,因此可以获得最大的回收效率。

ParNew收集器追求降低用户线程的停顿时间,因此适合交互式应用;而Parallel Scavenge追求CPU吞吐量,能够在较短的时间内完成指定任务,因此适合没有交互的后台计算。

Serial收集器适合所需内存较小的客户端应用。

Serial Old收集器是Serial的老年代版本,它们都是单线程收集器,也就是垃圾收集时只启动一条GC线程,因此都适合客户端应用。

Parallel Old收集器是Parallel Scavenge的老年代版本,一般它们搭配使用,追求CPU吞吐量。 

CMS收集器是一款追求停顿时间的老年代收集器,它在垃圾收集时使得用户线程和GC线程并行执行,因此在垃圾收集过程中用户也不会感受到明显的卡顿。但用户线程和GC线程之间不停地切换会有额外的开销,因此垃圾回收总时间就会被延长。

https://mp.weixin.qq.com/s?__biz=MzU0NTczODMwMw==&mid=2247483746&idx=1&sn=bd7878044b2b711646837265b9919988&chksm=fb691a32cc1e9324407653084ca8327f3ced3a74293c5fdbcdd62901b4c4122b99df8b4fe2ff&token=1282690993&lang=zh_CN#rd 

对象在堆里存储的结构

对象头、实际数据、对齐填充

https://www.cnblogs.com/james111/p/7273953.html

性能调优

服务器响应变慢排查步骤

线上服务运行时间长变慢问题的分析定位_服务时间长-优快云博客

CPU飙升排查步骤

cpu占用过高排查思路

2. top 查看占用cpu的进程 pid

4. top -Hp pid 查看进程中占用cpu过高的线程id  tid

6. printf '%x/n' tid 转化为十六进制

8. jstack pid |grep tid的十六进制 -A 30 查看堆栈信息定位

jvm old区占用过高排查思路

2. top查看占用cpu高的进程

4. jstat -gcutil pid 时间间隔 查看gc状况

6. jmap -dump:format=b,file=name.dump pid  导出dump文件

8. 用visualVM分析dump文件

https://mp.weixin.qq.com/s?__biz=MzU1MzUzODM2NQ%3D%3D&mid=2247483824&idx=1&sn=25718af824474cf19ded821463a351bf&scene=45#wechat_redirect 

https://mp.weixin.qq.com/s?__biz=MzA5NDg3MjAwMQ%3D%3D&mid=2457102720&idx=1&sn=c89686c389d3372c044278143405e6ef&scene=45#wechat_redirect 

垃圾回收调优

垃圾收集器的种类很多,我们可以将其分成两种类型,一种是响应速度快,一种是吞吐量高。通常情况下,CMS 和 G1 回收器的响应速度快,Parallel Scavenge 回收器的吞吐量高。

23 | 如何优化垃圾回收机制?-Java性能调优实战-极客时间

<think>嗯,用户问的是JVM相关的面试,我得先回忆一下常见的考点。JVM是Java面试中的高级问,通常会涉及内存模型、垃圾回收、性能监控工具等。 首先,可能需要分点整理,把常见的问列出来。比如内存区域划分、垃圾回收算法、参数这些基础概念。然后结合实际场景的问,比如OOM如何排查,GC日志分析,还有工具的使用如jstat、jmap、VisualVM等。 用户可能希望得到结构清晰的回答,所以需要分模块,每个部分有重点。比如先讲基础概念,再讲策略,然后是实战案例,最后工具和参数。还要注意用中文,避免专业术语错误,同时用LaTeX格式的公式,比如内存计算的例子可能需要用$$...$$来展示。 另外,用户提到系统级指令里的LaTeX要求,行内公式用$...$,独立公式用$$...$$,所以如果有涉及计算的例子,要注意格式正确。比如堆内存的计算:新生代、老年代的比例,可以用公式表示。 还要考虑用户的实际需求,可能是准备面试,需要快速掌握重点,所以回答要简明,重点突出。比如常见面试列举出来,每个问给出关键点,帮助用户记忆和理解。 需要检查是否有遗漏的重要知识点,比如G1垃圾回收器的特点,或者CMS的缺点。以及的具体步骤,比如分析日志、整参数、监控结果等流程。 可能还需要举例子说明,比如如何设置Xmx和Xms,或者Metaspace溢出的解决方法。这时候用实际的参数和命令会更直观,比如-XX:+HeapDumpOnOutOfMemoryError这样的参数。 最后,确保语言口语化,避免太过生硬,但信息要准确可靠。可能需要提醒用户没有固定答案,要根据具体场景分析,避免给出绝对化的建议。</think>以下是一些常见的JVM面试及其核心知识点整理,按模块化结构呈现: --- ### 一、基础概念类 1. **JVM内存模型划分** - 堆(`Heap`):`新生代`(Eden/S0/S1) + `老年代` - 公式:$$Heap = YoungGen(Eden + S0 + S1) + OldGen$$ - 非堆区:`元空间`(Metaspace)、`方法区`、`JIT代码缓存`等 2. **垃圾回收算法** - 标记-清除(碎片问)、标记-整理(内存规整)、复制算法(新生代) --- ### 二、策略类 3. **如何确定堆大小?** - 原则:避免频繁`Full GC`,同时减少`Stop-The-World`时间 - 参数示例:`-Xms4g -Xmx4g`(初始堆=最大堆,避免动态扩展) 4. **YoungGC频繁的可能原因?** - 新生代过小 → 增大`-Xmn` - 短生命周期对象过多 → 检查代码局部变量作用域 --- ### 三、实战场景类 5. **OOM(OutOfMemory)排查步骤** 1. 添加参数:`-XX:+HeapDumpOnOutOfMemoryError`生成堆转储 2. 使用`jmap -dump:format=b,file=heap.hprof <pid>`手动抓取 3. 通过`MAT`或`VisualVM`分析大对象引用链 6. **如何化Full GC时间长?** - 若使用`CMS`:检查并发失败(Concurrent Mode Failure) → 增大老年代 - 若使用`G1`:整`-XX:MaxGCPauseMillis`目标停顿时间 --- ### 四、工具与参数类 7. **常用监控命令** - `jstat -gcutil <pid>`:实时GC统计(Eden/Survivor/Old区利用率) - `jstack <pid>`:抓取线程栈,排查死锁/阻塞 8. **Metaspace溢出怎么办?** - 整`-XX:MetaspaceSize=256m`(初始大小) - 检查动态类加载(如反射、CGLIB代理) --- ### 五、高级 9. **G1 vs CMS区别** - G1:分Region回收,可预测停顿时间,适合大堆(>4G) - CMS:并发标记清除,但内存碎片风险高 10. **如何分析GC日志?** - 添加参数:`-Xloggc:gc.log -XX:+PrintGCDetails` - 关注`吞吐量`(业务时间占比)、`停顿时间`(单次GC耗时) --- ### 六、高频考点总结 - **必知参数**:`-Xmx`/`-Xms`、`-XX:NewRatio`、`-XX:SurvivorRatio` - **本质**:权衡`吞吐量`、`延迟`、`内存占用`三者关系 - **核心原则**:根据应用类型(Web/大数据/实时计算)选择GC器(G1/ZGC/Shenandoah) --- **注意**:实际需结合`压测工具`(如JMeter)和`APM监控`(如Arthas),避免纯理论参数整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值