JVM调优面试题及详细答案.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

JVM调优面试题及详细答案

一、基础概念类

1.说说你对JVM内存模型的理解,各个区域的作用是什么?

答案:JVM内存模型(JMM)主要规定了线程和内存之间的交互规则,目的是解决多线程环境下共享变量的可见性、原子性和有序性问题。而JVM内存结构(常被混淆为内存模型)分为以下几个核心区域,各自作用明确:

1)程序计数器:线程私有,记录当前线程执行的字节码指令地址(行号),CPU切换线程时靠它恢复执行位置,是唯一不会OOM的区域。比如多线程交替执行时,每个线程都有自己的计数器,确保切换后能接着执行。

2)虚拟机栈:线程私有,存储方法调用时的栈帧(包含局部变量表、操作数栈、动态链接、方法出口等)。局部变量表存基本数据类型和对象引用,栈深度默认1M左右,递归过深会导致StackOverflowError;如果线程数过多或栈空间申请过大,会OOM。

3)本地方法栈:和虚拟机栈类似,区别是为Native方法(如Object.wait()、System.currentTimeMillis())提供服务,同样会抛StackOverflowError和OOM。

4)堆:线程共享,JVM中最大的内存区域,唯一目的是存储对象实例和数组。堆是垃圾回收的核心区域,按GC分代可分为年轻代(Eden+Survivor0+Survivor1)和老年代,年轻代存新创建的对象,经过多次GC存活后进入老年代。堆空间不足时会抛OutOfMemoryError:Javaheapspace。

5)方法区:线程共享,存储类信息(类名、权限、字段、方法)、常量、静态变量、即时编译后的代码等。JDK8前用永久代实现,JDK8及后用元空间替代(元空间使用本地内存,默认无上限,可通过-XX:MaxMetaspaceSize限制),元空间满了会抛OutOfMemoryError:Metaspace。

2.什么是GC?常见的垃圾收集算法有哪些,各自的优缺点是什么?

答案:GC(GarbageCollection)即垃圾回收,是JVM自动回收堆中“死亡对象”(不再被任何引用指向的对象)所占内存的过程,目的是避免内存泄漏,减少手动管理内存的风险。

常见垃圾收集算法及优缺点:

1)标记-清除算法:分“标记”和“清除”两步。标记阶段遍历所有对象,标记存活对象;清除阶段回收未标记的死亡对象。优点是实现简单,不需要移动对象;缺点是会产生大量内存碎片(小内存块分散,无法满足大对象分配需求),且标记和清除过程效率低,适合存活对象多、垃圾少的场景(如老年代)。

2)标记-复制算法:将内存分为大小相等的两块(如Survivor0和Survivor1),每次只使用一块。标记存活对象后,将其复制到另一块未使用的内存,然后清空当前使用的内存块。优点是无内存碎片,复制效率高;缺点是内存利用率低(仅50%),适合存活对象少、垃圾多的场景(如年轻代,Eden区满后,存活对象复制到Survivor,Eden直接清空)。

3)标记-整理算法:标记存活对象后,将存活对象向内存一端移动,然后清空另一端的死亡对象内存。优点是无内存碎片,内存利用率高;缺点是需要移动对象,额外消耗CPU资源,适合存活对象多的老年代。

4)分代收集算法:不是独立算法,而是结合前三种算法的思想,根据对象存活周期将堆分为年轻代和老年代。年轻代用标记-复制算法(存活少、垃圾多),老年代用标记-清除或标记-整理算法(存活多、垃圾少),兼顾了回收效率和内存利用率,是目前主流JVM的默认选择。

二、垃圾收集器类

1.常见的垃圾收集器有哪些?它们的适用场景是什么?

答案:垃圾收集器是GC算法的具体实现,不同收集器针对不同场景优化,常见的有以下几种(按分代/区域划分):

1)Serial收集器(串行收集器):

-特点:单线程回收,回收时暂停所有用户线程(StopTheWorld,STW),实现简单、内存占用少。

-适用场景:年轻代收集(SerialCopy)或老年代收集(SerialMark-Sweep-Compact),适合单CPU、内存小的客户端程序(如桌面应用),生产环境服务器基本不用。

2)ParNew收集器(并行年轻代收集器):

-特点:Serial的多线程版本,年轻代回收用多线程,减少STW时间,支持CMS收集器(老年代)配合使用。

-适用场景:年轻代收集,多CPU服务器环境,是CMS收集器的默认年轻代搭配,适合对响应时间有一定要求的服务。

3)ParallelScavenge收集器(并行吞吐量收集器):

-特点:年轻代收集,多线程回收,目标是“高吞吐量”(吞吐量=用户线程运行时间/(用户线程时间+GC时间)),支持自适应调节(自动调整堆大小、回收频率等参数)。

-适用场景:年轻代收集,多CPU服务器,适合后台

文档评论(0)

151****9429 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档