线上问题定位+JVM核心面试题全解析

发布时间:2026/7/27 18:48:16

线上问题定位+JVM核心面试题全解析 在后端开发面试中“线上问题定位”和“JVM相关”是高频必考考点也是实际工作中不可或缺的核心能力。很多开发者面对线上接口报错、CPU飙高、OOM等问题时手足无措对JVM底层原理更是一知半解导致面试失利或工作中踩坑。本文将结合实际工作场景详细拆解线上问题定位全流程同步梳理43道JVM核心面试题含通俗解析实操细节帮你吃透知识点从容应对面试与工作难题。第01章线上问题定位全流程项目上线后出现问题核心排查原则是先定位问题根源再解决问题最后验证迭代。根据是否有运维人员排查流程分为两种情况重点掌握无运维场景下的实操方法面试重点考察。1.1 有运维人员的排查流程简单场景运维人员配合开发人员拉取项目运行日志 → 开发人员结合日志与本地源码分析定位问题 → 修复源码 → 运维人员部署迭代验证问题是否解决。1.2 无运维人员的排查流程核心重点开发人员需直接操作生产服务器根据问题类型接口报错、RT超时、CPU飙高、OOM、死锁等采用对应排查方案不同问题的排查思路差异较大以下是高频问题的详细实操步骤。1.2.1 接口报错 RT超时request timeout最常见的线上问题核心排查核心是“日志分析”分单机和分布式两种场景单机项目排查直接进入服务器排查项目运行日志。优先查看tomcat的logs目录或项目自身的logs文件夹找到报错信息如异常堆栈、接口调用失败详情结合本地源码定位问题如参数错误、数据库连接异常、接口逻辑bug修复后重新部署迭代。分布式项目排查需依赖日志采集系统核心掌握两种主流架构面试必问Spring Boot Admin 监控架构微服务集成Spring Boot Admin ClientClient会定时将微服务的CPU使用率、线程信息、内存信息及运行日志汇报给Spring Boot Admin Server开发人员通过Server可视化界面统一查看所有微服务的日志与监控数据快速定位问题。ELK 监控架构ELK是ElasticSearch日志存储、Logstash日志采集、Kibana可视化展示的组合主流两种架构架构一简单易上手Logstash部署在各个节点采集日志并过滤分析直接发送给ElasticSearch存储Kibana提供Web界面查询日志、生成报表。优点搭建简单缺点Logstash耗资源高无消息队列缓存存在数据丢失风险。架构二生产常用引入Kafka/Redis作为消息队列Logstash Agent先将日志发送到消息队列再由Logstash从队列中读取日志、过滤分析最终发送给ElasticSearch。优点避免数据丢失即使Logstash故障日志先存在队列中缺点搭建复杂度略高。1.2.2 无报错但程序卡死CPU飙高、死锁此类问题隐蔽性强核心是“排查线程状态”掌握原生工具和Arthas工具的使用面试高频实操考点。1CPU飙高问题排查方式1原生工具jdk自带无需额外安装通过top命令查看系统资源占用情况确认CPU占用率是否过高通常超过80%需重点关注。通过ps -ef | grep java命令查询目标Java进程的PID进程号。通过top -H -p PID命令查看该进程下所有线程的CPU占用情况找到占用CPU最高的线程IDtid。可选将线程ID从十进制转为十六进制命令printf %x tid用于后续定位线程堆栈非必需jstack可直接识别十进制tid。通过jstack -l PID命令查看进程的线程堆栈信息结合线程ID找到对应的线程逻辑定位CPU飙高的原因如死循环、频繁GC。注意开发时需给每个线程分配明确的线程名称便于快速定位线程对应的业务逻辑。方式2Arthas工具阿尔萨斯阿里开源高效排查Arthas是线上问题排查的“神器”无需重启项目可实时查看线程、内存、日志等信息步骤如下下载安装官网地址https://arthas.aliyun.com/doc/download.html解压后得到arthas-boot.jar。启动Arthas进入解压目录执行命令java -jar arthas-boot.jar会列出当前所有Java进程。选择目标进程输入进程对应的序号如1回车即可附着到该进程。排查CPU飙高执行thread命令查看所有线程的CPU占用情况找到占用率最高的线程结合thread -n 5查看CPU占用前5的线程定位线程对应的业务代码分析问题原因。2死锁问题排查死锁定义两个或多个线程互相持有对方所需的资源导致所有线程处于等待状态无法继续执行面试常考定义。第一步死锁演示理解核心场景通过简单代码演示死锁场景帮助理解排查逻辑// 锁对象接口 public interface MyLock { public static final Object R1 new Object(); public static final Object R2 new Object(); } // 死锁线程 public class DeadThread extends Thread { private boolean flag; public DeadThread(boolean flag) { this.flag flag; } Override public void run() { if (flag) { synchronized (MyLock.R1) { System.out.println(Thread.currentThread().getName() ---获取到了R1锁申请R2锁....); synchronized (MyLock.R2) { System.out.println(Thread.currentThread().getName() ---获取到了R1锁获取到了R2锁....); } } } else { synchronized (MyLock.R2) { System.out.println(Thread.currentThread().getName() ---获取到了R2锁申请R1锁....); synchronized (MyLock.R1) { System.out.println(Thread.currentThread().getName() ---获取到了R2锁获取到了R1锁....); } } } } } // 测试类 public class DeadThreadDemo1 { public static void main(String[] args) { DeadThread deadThread1 new DeadThread(true); DeadThread deadThread2 new DeadThread(false); deadThread1.start(); deadThread2.start(); } }控制台输出Thread-0---获取到了R1锁申请R2锁....Thread-1---获取到了R2锁申请R1锁....程序卡死即为死锁。第二步死锁排查方法方式1原生工具jstack最常用通过jps命令获取死锁程序的PID如8144。执行jstack -l 8144命令查看线程堆栈信息会明确提示“Found 1 deadlock”并列出每个线程持有的锁和等待的锁从而定位死锁代码。方式2Arthas工具启动Arthas附着到目标进程步骤同CPU排查。执行thread命令查看线程状态找到状态为BLOCKED阻塞的线程。执行thread -b命令直接检测死锁打印死锁线程的堆栈信息和锁持有情况。通过jad 全类名如jad com.atguigu.cloud.demo.DeadThread反编译代码定位死锁代码进行修复如调整锁的获取顺序。1.2.3 OOM异常内存溢出面试重中之重OOMjava.lang.OutOfMemoryError是线上致命问题核心是“内存不足”但不同类型的OOM排查思路不同先明确OOM的常见类型再掌握定位流程。1OOM的4种常见类型面试必背Java heap space堆内存溢出。Full GC后堆内存仍无法容纳新对象无法扩展堆内存时触发最常见。PermGen space永久代溢出JDK7及之前。方法区加载的类过多如框架动态生成大量类。Metaspace元空间溢出JDK8及之后。替代永久代本质是方法区溢出原因同永久代。Direct Memory space直接内存堆外内存溢出。JVM不管理直接内存需手动释放如NIO使用不当。补充方法区溢出的核心原因——框架动态生成类过多比如Mybatis调用Mapper接口、AOP动态代理、Feign接口调用等场景若配置不当会生成大量动态类导致方法区溢出。2OOM问题定位全流程实操步骤面试必问第一步生成OOM异常日志文件在JVM启动参数中添加配置让OOM发生时自动生成堆转储文件.hprof格式命令-Xms30m -Xmx30m -XX:HeapDumpOnOutOfMemoryError。参数说明-Xms初始堆大小、-Xmx最大堆大小设置较小的堆大小便于快速复现OOM-XX:HeapDumpOnOutOfMemoryErrorOOM时自动生成堆转储文件。第二步分析堆转储文件常用分析工具二选一即可面试需说出工具名称IDEA直接打开将.hprof文件拖入IDEAIDEA会自动解析展示内存使用情况、大对象、对象引用关系等。JDK自带工具jvisualvmJDK/bin目录下打开后导入.hprof文件进行内存分析。专业工具Eclipse Memory AnalyzerMAT、YourKit Java Profiler适合复杂场景的内存分析。第三步定位问题并优化分析流程收集OOM日志 → 导入堆转储文件 → 查看内存占用Top对象 → 排查对象引用关系是否存在内存泄漏 → 优化代码或调整JVM参数。核心优化方向减少大对象创建、优化数据结构、调整缓存策略、增加堆内存大小-Xms和-Xmx、修复内存泄漏如清理无用的静态集合引用。第02章JVM核心面试题全解析43道覆盖所有高频考点以下面试题均为大厂高频考点解析采用“口语化核心重点”模式避免晦涩难懂便于记忆和面试表达重点题目标红强调。一、JVM基础架构3道1. 说一下JVM由哪些部分组成运行流程是什么核心组成4部分必背类加载器、运行时数据区、执行引擎、本地接口。运行流程口语化好记.java文件 → javac编译 → .class字节码文件 → 类加载器加载字节码到运行时数据区方法区 → 执行引擎将字节码翻译成机器码 → 本地接口调用native方法C/C → CPU执行机器码。2. 说一下JVM运行时数据区核心5个区域3个线程私有2个线程共享必背面试高频。线程私有线程创建则存在线程结束则销毁程序计数器记录当前线程执行的字节码行号线程切换时用于恢复执行位置唯一不会出现OOM的区域。Java虚拟机栈描述Java方法执行过程每个方法对应一个栈帧存局部变量、操作数栈等方法执行完栈帧销毁递归过深会报StackOverflowError。本地方法栈和虚拟机栈功能一致区别是服务于native方法C/C编写。线程共享JVM启动则存在关闭则销毁Java堆最大的内存区域存所有对象实例和数组是GC的主要区域GC堆可通过-Xms、-Xmx调整大小满了会报OOM。方法区存加载的类信息、静态变量、常量、编译后的代码非堆JDK8后用元空间替代永久代满了会报OOM。3. 你听过直接内存吗听过直接内存堆外内存不是运行时数据区的一部分JVM不自动管理需手动释放如NIO使用后需关闭资源。特点独立于JVM内存可避免堆内存不足的问题但使用不当会导致直接内存溢出且不会被GC自动回收容易造成内存泄漏。二、运行时数据区细节5道重点4. 详细介绍下程序计数器重点核心一块极小的内存区域核心作用是记录当前线程正在执行的字节码指令地址行号。为什么需要JVM多线程是CPU轮流调度线程切换时CPU需要知道上次执行到哪里程序计数器为每个线程单独存在互不干扰切换后可恢复执行位置。关键考点唯一不会出现OOM的JVM区域。5. 详细介绍下Java虚拟机栈?重点线程私有与线程生命周期一致核心作用是描述Java方法的执行过程基本单位是栈帧。栈帧包含4部分必背局部变量表存方法内的局部变量基本类型、对象引用地址。操作数栈用于执行运算如11先入栈1和1计算后出栈结果。动态链接存方法引用地址用于调用其他方法如service.add()。方法出口记录方法执行完后回到调用者的位置return或异常退出。补充面试题递归为什么会栈溢出因为递归会不断创建新栈帧栈容量有限栈帧满了就报StackOverflowError。6. 详细介绍下Java堆重点线程共享JVM启动时创建是内存最大的区域核心作用是存对象实例和数组几乎所有对象都在这里分配。关键细节别名“GC堆”垃圾回收器主要回收这里的内存。分区为了高效GC分为新生代1/3和老年代2/3新生代又分Eden8、From Survivor1、To Survivor1。参数调整-Xms初始堆、-Xmx最大堆建议两者设为一致避免频繁扩展堆影响性能。OOM场景堆内存不足无法分配新对象报Java heap space。7. 解释一下本地方法栈和Java虚拟机栈功能完全一致唯一区别服务的对象不同。虚拟机栈服务于Java方法我们写的Java代码本地方法栈服务于native关键字修饰的本地方法C/C编写无Java源码用于存储本地方法的局部变量、操作数等执行信息。8. 详细解释一下方法区重点线程共享又称“非堆”核心作用是存“类相关”的信息不存对象实例对象在堆里。存储内容必背加载的类信息类名、方法、字段、静态变量static修饰、常量String常量、即时编译器编译后的代码。关键考点JDK8后方法区由“元空间”替代“永久代”元空间不在JVM内存中而是使用本地内存默认无上限可通过-XX:MaxMetaspaceSize限制。三、内存泄漏与OOM2道高频9. Java会存在内存泄漏吗请说明为什么会存在虽然Java有GC自动回收垃圾但GC无法回收“被引用但无用的对象”。核心原因长生命周期对象持有短生命周期对象的引用导致短生命周期对象无用后仍被引用GC无法识别为垃圾长期占用内存形成内存泄漏。示例静态集合长生命周期中存入临时对象短生命周期临时对象用完后未从集合中移除集合一直引用导致临时对象无法被GC回收。10. 什么是OOM常见的OOM类型有哪些同线上问题定位部分重点背诵OOMjava.lang.OutOfMemoryError即内存溢出指JVM无法申请到足够的内存并非仅指堆溢出。4种常见类型必背Java heap space、PermGen space、Metaspace、Direct Memory space详细说明见线上问题定位1.2.3。四、垃圾回收GC相关12道重中之重11. 简述Java垃圾回收机制核心JVM自动回收“无用对象”垃圾的过程无需程序员手动释放内存。流程GC线程低优先级监控所有对象 → 标记无用对象不可达对象 → 回收无用对象的内存 → 释放内存供新对象使用。触发时机JVM空闲时、堆内存不足时。12. GC是什么为什么要GCGCGarbage Collection垃圾回收即JVM自动回收无用对象、释放内存的过程。为什么需要GC手动管理内存易出错忘记释放、释放错误导致内存泄漏、程序崩溃Java无手动释放内存的方法依赖GC保证程序稳定运行。13. 垃圾回收器的原理是什么有什么办法手动进行垃圾回收核心原理GC监控所有对象的引用关系用“有向图”记录引用链区分可达对象正在使用和不可达对象垃圾触发GC时回收不可达对象。手动触发GC调用System.gc()方法但仅为“通知”GC工作不强制执行GC执行时机由JVM决定。14. JVM中都有哪些引用类型4种必背按强度从强到弱排序口语化解释便于记忆强引用平时new对象如Object obj new Object()只要有强引用即使内存不足JVM也不回收宁愿报OOM。软引用SoftReference实现内存足够时不回收内存不足时回收如浏览器后退按钮缓存。弱引用WeakReference实现无论内存是否足够GC扫描到就回收生命周期短。虚引用PhantomReference实现和无引用几乎一致用于跟踪对象回收过程几乎不用。15. 怎么判断对象是否可以被回收2种方法重点引用计数器法已淘汰给对象加计数器引用1释放-1计数器为0则可回收。缺点无法解决循环引用A引用BB引用A计数器均为1GC无法识别。可达性分析算法主流从GC Roots线程栈局部变量、静态变量、常量出发搜索引用链无引用链连接的对象即为不可达对象可回收能解决循环引用。16. JVM垃圾回收算法有哪些4种必背标记-清除算法基础标记垃圾 → 一次性清除。优点简单缺点效率低、产生内存碎片。复制算法新生代用内存分成两块用一块存对象GC时复制存活对象到另一块清空当前块。优点效率高、无碎片缺点内存利用率低仅用一半。标记-整理算法老年代用标记垃圾 → 移动存活对象到内存一端 → 清除另一端垃圾。优点无碎片缺点效率低于复制算法。分代算法生产常用按对象存活时间分区域新生代老年代新生代用复制算法老年代用标记-整理算法兼顾效率和内存利用率。17. 讲一下新生代、老年代、永久代的区别重点核心新生代、老年代属于Java堆存对象永久代JDK7/元空间JDK8属于方法区存类信息。新生代存新创建的对象朝生夕死存活率低分Eden8、From1、To1GC用复制算法频繁触发Minor GC。老年代存存活时间长的对象经过多次Minor GC存活率高GC用标记-整理算法触发Major GC不频繁。永久代/元空间存类信息、静态变量JDK8用元空间替代永久代使用本地内存不易溢出。18. Minor GC、Major GC、Full GC是什么重点Minor GC新生代GC回收EdenSurvivor区频繁、速度快用复制算法。Major GC老年代GC回收老年代速度慢通常触发前先触发Minor GC。Full GC全堆GC回收新生代老年代方法区速度最慢会导致程序停顿尽量避免频繁触发。19. Minor GC、Major GC、Full GC的触发条件重点Minor GCEden区满或新对象大于Eden剩余空间。Major GC/Full GC基本等价晋升到老年代的对象平均大小超过老年代剩余空间Minor GC后存活对象超过老年代剩余空间方法区元空间空间不足手动调用System.gc()大对象直接进入老年代老年代存不下。20. 为什么新生代要分Eden和两个Survivor区域重点核心目的减少进入老年代的对象避免频繁触发Full GCFull GC速度慢影响性能。原理新对象先放EdenMinor GC后存活对象移到Survivor From下次Minor GC后EdenFrom的存活对象移到To循环往复只有经过15次默认Minor GC还存活的对象才进入老年代减少老年代压力。21. Java堆老年代和新生代的默认比例必背新生代:老年代 1:2-XX:NewRatio2修改。新生代内部Eden:From:To 8:1:1-XX:SurvivorRatio8修改。补充新生代实际可用内存 Eden 一个Survivor90%另一个Survivor空闲用于复制存活对象。22. 为什么要分代核心根据对象存活周期采用最合适的GC算法兼顾效率和内存利用率因材施教。新生代对象存活率低用复制算法效率高老年代对象存活率高用标记-整理算法无碎片减少GC对程序性能的影响。五、垃圾回收器3道高频23. 说一下JVM有哪些垃圾回收器分类记忆新生代回收器只回收新生代Serial串行单线程、ParNew并行多线程配合CMS、Parallel Scavenge并行追求高吞吐量。老年代回收器只回收老年代Serial Old串行单线程、Parallel Old并行追求吞吐量、CMS并发追求短停顿。全堆回收器回收新生代老年代G1垃圾优先JDK1.9默认兼顾吞吐量和停顿。24. 新生代垃圾回收器和老年代垃圾回收器都有哪些有什么区别区别核心3点必背回收区域不同新生代回收器只回收新生代老年代只回收老年代。算法不同新生代用复制算法老年代用标记-清除/标记-整理算法。核心目标不同新生代追求效率快老年代追求吞吐量Parallel Old或短停顿CMS。25. 简述分代垃圾回收器是怎么工作的流程口语化好记堆分新生代1/3和老年代2/3新生代分Eden、From、To。新对象优先分配到EdenEden满触发Minor GC存活对象移到From清空Eden。下次Minor GCEdenFrom的存活对象移到To清空Eden和FromFrom和To交换身份。对象每经历一次Minor GC年龄1达到15默认晋升到老年代。老年代满触发Major GC/Full GC用标记-整理算法回收垃圾。六、内存分配与回收策略3道26. 简述java内存分配与回收策略以及Minor GC和Major GC内存分配策略3个核心大部分对象优先分配到新生代Eden区。大对象直接分配到老年代无需经过新生代。长期存活对象多次Minor GC后晋升到老年代。Minor GC/Major GC简化记Minor GC新生代频繁快、Major GC老年代不频繁慢、Full GC全堆尽量避免。27. 对象优先在Eden区分配核心new的对象绝大多数先分配到Eden区Eden满触发Minor GCGC后仍无足够空间启用分配担保在老年代分配内存。28. 长期存活对象将进入老年代JVM给每个对象加年龄计数器对象在Eden出生Minor GC后存活进入Survivor年龄设为1。每经历一次Minor GC存活则年龄1。年龄达到15默认-XX:MaxTenuringThreshold修改晋升到老年代。七、类加载机制5道高频29. 简述java类加载机制?核心JVM将.class字节码文件加载到内存经过一系列处理转换成可使用的Java类型的过程核心步骤加载 → 连接 → 初始化。30. 类加载的机制及过程重点加载类加载器找到.class文件本地、Jar包等读入内存在堆生成Class对象访问方法区的入口将静态数据转为方法区运行时数据结构。连接3小步验证检查.class文件合法性、安全性确保符合JVM规范。准备给类变量static分配内存方法区设置默认初始值如int0Stringnull不执行用户设置的初始值。解析将常量池的符号引用类名、方法名字符串替换为直接引用内存地址。初始化执行类构造器方法合并类变量赋值和静态代码块先初始化父类再初始化子类。31. 描述一下JVM加载Class文件的原理机制核心类必须被类加载器加载到JVM才能运行类加载器负责读取.class字节流转换为JVM可识别的格式。加载方式2种隐式装载new对象、调用静态方法时JVM自动加载类如new User()。显式装载手动加载如Class.forName(全类名)常用于反射、JDBC驱动加载。补充类加载是动态的用到时才加载节省内存。32. 什么是类加载器类加载器有哪些?重点类加载器通过类的全限定名获取.class字节流的工具负责加载类。4种类加载器自上而下父到子引导类加载器BootstrapC实现加载JRE/lib核心类库如java.lang.String无法被Java代码访问。扩展类加载器Extension加载JRE/lib/ext目录下的扩展Jar包父加载器是引导类加载器。应用程序类加载器Application系统类加载器加载ClassPath下的自定义类父加载器是扩展类加载器平时使用的就是这个。自定义类加载器继承ClassLoader加载自定义路径下的类如加密的.class文件。33. 什么是双亲委派模型怎么打破双亲委派模型重点面试高频双亲委派模型类加载器加载类时的规则“双亲”指父加载器和子加载器非继承关系。规则必背子加载器收到加载请求不自己加载先交给父加载器依次向上传递到引导类加载器父加载器能加载则加载不能加载则子加载器自己尝试加载。目的保证类的唯一性如java.lang.String只能由引导类加载器加载避免核心类被篡改保证安全。打破方式继承ClassLoader类重写loadClass方法和findClass方法双亲委派逻辑在loadClass中重写后改变委派规则。示例Tomcat的类加载器打破双亲委派用于加载不同Web应用的类避免类冲突。八、JVM调优与实操5道重点34. 常用的JVM调优的参数都有哪些必背实操考点堆内存相关最常用-Xms初始堆大小如-Xms2g建议与-Xmx一致。-Xmx最大堆大小如-Xmx4g。-Xmn新生代大小如-Xmn1g。-XX:NewRation新生代:老年代比例如-XX:NewRatio3 → 1:3。-XX:SurvivorRationEden:Survivor比例默认8 → 8:1:1。栈内存相关-Xss每个线程栈大小默认1M如-Xss512k减小可创建更多线程。方法区相关JDK7-XX:PermSize、-XX:MaxPermSize永久代大小。JDK8-XX:MetaspaceSize、-XX:MaxMetaspaceSize元空间大小。其他常用-XX:MaxTenuringThresholdn对象晋升老年代的年龄默认15。-XX:PrintGC打印GC日志。-XX:PrintGCDetails打印详细GC日志排查问题用。35. JVM的GC收集器设置实操通过“-XX:UseXXXGC”指定GC收集器常用-XX:UseSerialGC串行收集器新生代单线程小型程序。-XX:UseParNewGCParNew收集器新生代多线程配合CMS。-XX:UseParallelGCParallel Scavenge新生代追求高吞吐量。-XX:UseParallelOldGCParallel Old老年代追求吞吐量。-XX:UseConcMarkSweepGCCMS老年代追求短停顿交互类程序。-XX:UseG1GCG1收集器全堆JDK1.9默认兼顾吞吐量和停顿。36. JVM内存模型的相关知识了解多少主内存、工作内存、重排序、内存屏障、happen-before主内存和工作内存核心主内存存所有变量静态、实例变量线程共享。工作内存每个线程私有存主内存变量的副本线程操作变量必须在工作内存中进行线程间通信需通过主内存。指令重排序CPU为提高效率打乱代码执行顺序单线程不影响结果多线程可能出错。内存屏障禁止重排序保证内存可见性4种无需记细节知道作用即可。happen-before原则先行发生A happen-before B → A的结果能被B看到JVM保证可见性常用5个单线程前操作happen-before后操作。锁解锁happen-before加锁。volatile写操作happen-before所有读操作。传递性A→BB→C则A→C。线程启动start() happen-before线程内操作。37. 怎么打出线程栈信息实操面试必问获取Java进程PID执行jps命令列出所有Java进程前面的数字是PID。可选查看线程CPU占用top -Hp PID找到占用CPU高的线程ID。打印线程栈jstack PID控制台直接显示线程栈信息。保存到文件jstack -l PID /tmp/thread.txt便于后续分析。补充可通过fastthread.io等在线工具上传线程栈文件自动分析死锁、线程阻塞等问题。38. 堆栈的区别是什么必背高频这里的堆Java堆栈Java虚拟机栈核心4点区别共享性堆线程共享栈线程私有。存储内容堆存对象实例和数组栈存方法栈帧局部变量、操作数等。生命周期堆随JVM启动/关闭栈随线程启动/结束。内存管理堆是GC主要区域自动回收栈帧随方法执行完自动销毁无需GC。补充静态变量在方法区不在堆和栈静态对象引用在方法区对象本身在堆。第03章总结与核心技巧本文整合了线上问题定位全流程接口报错、CPU飙高、死锁、OOM和43道JVM核心面试题覆盖高频考点技巧线上问题定位重点掌握“日志分析”和“工具使用”jstack、Arthas回答时要体现“实操步骤”不要只说理论。JVM面试核心背诵“运行时数据区、GC算法、分代模型、类加载机制”回答时用口语化表述结合实际场景如OOM排查、GC调优体现实战能力。高频考点OOM类型及排查、GC算法、分代模型、双亲委派模型、JVM调优参数、线程栈打印这些是必背内容务必熟练掌握。

相关新闻