java jvm调优面试题及答案大全.doc
10页java jvm调优面试题及答案大全 一、单项选择题1. 以下哪个参数用于设置堆的初始大小?A. -XmsB. -XmxC. -XmnD. -XX:PermSize答案:AXms用于设置堆的初始大小;-Xmx设置堆的最大大小;-Xmn设置新生代的大小;-XX:PermSize设置永久代的初始大小2. 当发生Minor GC时,以下哪个区域不会被清理?A. Eden区B. Survivor区C. 老年代D. 以上都不对答案:CMinor GC主要是对新生代(包括Eden区和Survivor区)进行垃圾回收,老年代一般在Major GC时才会被清理3. 以下哪种垃圾收集器是并行收集器?A. SerialB. ParNewC. CMSD. G1答案:BSerial是串行收集器;ParNew是并行收集器;CMS是并发收集器;G1是兼顾并行与并发的收集器4. 在JVM中,元空间(Metaspace)取代了哪个区域?A. 堆B. 栈C. 永久代D. 本地方法栈答案:C在Java 8及以后,元空间取代了永久代5. 以下哪个选项是JVM监控工具?A. javacB. javaC. jstatD. jdk答案:C。
javac是Java编译器;java是Java虚拟机启动命令;jstat是JVM监控工具;jdk是Java开发工具包6. 当JVM发生OutOfMemoryError: Java heap space时,通常是因为?A. 堆空间不足B. 栈空间不足C. 元空间不足D. 本地内存不足答案:AOutOfMemoryError: Java heap space表示堆空间不足7. 以下哪个参数用于设置新生代与老年代的比例?A. -XX:SurvivorRatioB. -XX:NewRatioC. -XX:MaxTenuringThresholdD. -XX:MetaspaceSize答案:BXX:SurvivorRatio设置Eden区与Survivor区的比例;-XX:NewRatio设置新生代与老年代的比例;-XX:MaxTenuringThreshold设置对象晋升到老年代的年龄阈值;-XX:MetaspaceSize设置元空间的初始大小8. 以下哪种垃圾收集器适用于对响应时间要求较高的场景?A. SerialB. Parallel ScavengeC. CMSD. Parallel Old答案:C。
CMS收集器以获取最短回收停顿时间为目标,适用于对响应时间要求较高的场景9. JVM中,对象在什么情况下会进入老年代?A. 在Survivor区经过多次Minor GC未被回收B. 新建对象大小超过Eden区大小C. 以上都是D. 以上都不是答案:C对象在Survivor区经过多次Minor GC未被回收会进入老年代,新建对象大小超过Eden区大小也可能直接进入老年代10. 以下哪个参数用于开启GC日志?A. -XX:+PrintGCB. -XX:+UseSerialGCC. -XX:+UseParallelGCD. -XX:+UseG1GC答案:AXX:+PrintGC用于开启简单的GC日志;-XX:+UseSerialGC使用串行收集器;-XX:+UseParallelGC使用并行收集器;-XX:+UseG1GC使用G1收集器 二、多项选择题1. 以下属于JVM堆区域的有?A. Eden区B. Survivor区C. 老年代D. 元空间答案:ABC元空间不属于堆区域,Eden区、Survivor区和老年代都属于堆2. 常见的垃圾收集算法有?A. 标记 - 清除算法B. 标记 - 整理算法C. 复制算法D. 分代收集算法答案:ABCD。
标记 - 清除算法、标记 - 整理算法、复制算法是基本的垃圾收集算法,分代收集算法是综合运用这些算法3. 以下哪些是JVM的性能指标?A. 吞吐量B. 响应时间C. 内存占用D. 垃圾收集频率答案:ABCD吞吐量、响应时间、内存占用和垃圾收集频率都是JVM的重要性能指标4. 可以用于JVM调优的参数有?A. -XmxB. -XmnC. -XX:MaxPermSizeD. -XX:+UseConcMarkSweepGC答案:ABD在Java 8及以后,永久代被元空间取代,不存在-XX:MaxPermSize参数,-Xmx、-Xmn、-XX:+UseConcMarkSweepGC都可用于JVM调优5. 以下关于垃圾收集器的说法正确的有?A. Serial收集器是单线程的B. Parallel Scavenge收集器关注吞吐量C. CMS收集器以最短回收停顿时间为目标D. G1收集器是分代收集器答案:ABCDSerial收集器是单线程的;Parallel Scavenge收集器主要关注吞吐量;CMS收集器以获取最短回收停顿时间为目标;G1收集器是分代收集器6. 当JVM出现内存泄漏时,可能的原因有?A. 静态集合类持有对象引用B. 未关闭的资源(如文件、数据库连接等)C. 内部类持有外部类的引用D. 缓存未及时清理答案:ABCD。
静态集合类持有对象引用、未关闭的资源、内部类持有外部类的引用、缓存未及时清理都可能导致内存泄漏7. 以下哪些工具可以用于JVM性能分析?A. VisualVMB. YourKitC. ArthasD. jmap答案:ABCDVisualVM、YourKit、Arthas和jmap都可用于JVM性能分析8. JVM的内存区域中,线程私有的有?A. 程序计数器B. 虚拟机栈C. 本地方法栈D. 堆答案:ABC程序计数器、虚拟机栈和本地方法栈是线程私有的,堆是线程共享的9. 关于对象创建,以下说法正确的有?A. 对象创建可能会在Eden区分配内存B. 大对象可能直接在老年代分配内存C. 对象创建需要进行类加载和初始化D. 对象创建时会检查类是否已经加载答案:ABCD对象创建时,小对象一般在Eden区分配内存,大对象可能直接在老年代分配,创建过程需要类加载和初始化,并且会检查类是否已经加载10. 可以通过哪些方式获取JVM的内存使用情况?A. jstatB. jmapC. VisualVMD. 代码中使用Runtime类答案:ABCDjstat、jmap、VisualVM都可获取JVM内存使用情况,代码中使用Runtime类也能获取相关信息。
三、判断题1. JVM的堆和栈都是线程共享的内存区域答案:错误堆是线程共享的,栈(包括虚拟机栈和本地方法栈)是线程私有的2. 垃圾收集器的主要作用是回收不再使用的对象占用的内存答案:正确垃圾收集器的核心任务就是回收不再使用的对象占用的内存3. 所有的垃圾收集器都需要暂停应用程序线程答案:错误CMS和G1等并发收集器在部分阶段可以和应用程序线程并发执行,不需要完全暂停应用程序线程4. 增加堆的大小一定能提高JVM的性能答案:错误增加堆的大小可能会减少垃圾收集的频率,但也可能导致垃圾收集时间变长,不一定能提高性能5. 元空间的大小是固定的,不能动态调整答案:错误元空间的大小可以通过参数进行动态调整6. 当发生Full GC时,会对整个堆进行垃圾回收答案:正确Full GC会对整个堆(包括新生代、老年代)以及元空间等进行垃圾回收7. 标记 - 清除算法会产生内存碎片答案:正确标记 - 清除算法在回收后会产生大量的内存碎片8. 可以使用jstack命令查看JVM的线程堆栈信息答案:正确jstack命令用于查看JVM的线程堆栈信息9. 本地方法栈主要用于执行Java的本地方法答案:正确本地方法栈为执行Java的本地方法提供内存支持。
10. 新生代中的对象经过多次Minor GC后一定会进入老年代答案:错误对象晋升到老年代除了年龄阈值的条件外,还有大对象直接进入等情况,且满足年龄阈值也只是可能进入老年代 四、简答题1. 简述JVM的内存模型JVM内存模型主要包括线程共享和线程私有两部分线程共享的有堆和元空间,堆是对象存储的主要区域,分为新生代(含Eden区和Survivor区)和老年代;元空间存储类的元数据线程私有的有程序计数器、虚拟机栈和本地方法栈,程序计数器记录线程执行的字节码行号,虚拟机栈存储方法调用的栈帧,本地方法栈为本地方法服务2. 说明垃圾收集的分代收集算法原理分代收集算法基于对象的存活周期不同进行分区新生代对象存活时间短,采用复制算法,将存活对象复制到Survivor区或老年代老年代对象存活时间长,使用标记 - 清除或标记 - 整理算法,减少复制开销这样根据不同区域特点采用合适算法,提高垃圾收集效率3. 解释CMS收集器的工作流程CMS收集器工作流程主要有初始标记、并发标记、重新标记和并发清除四个阶段初始标记暂停应用线程,标记GC Roots直接关联的对象;并发标记和应用线程并发执行,遍历对象图;重新标记修正并发标记阶段变动的对象;并发清除和应用线程并发,清除标记的对象。
4. 如何进行JVM的初步性能调优?初步调优可从设置堆大小开始,合理设置 -Xms和 -Xmx,避免频繁的垃圾收集选择合适的垃圾收集器,如对响应时间要求高选CMS或G1监控JVM性能,使用工具如jstat、VisualVM获取内存使用、垃圾收集频率等信息,根据结果调整参数 五、讨论题1. 讨论不同垃圾收集器在不同应用场景下的选择对于单CPU、小内存且对吞吐量要求不高的应用,可选择Serial收集器需要高吞吐量的后台计算型应用,Parallel Scavenge和Parallel Old组合合适对响应时间要求高的Web应用,CMS收集器能减少停顿时间而对于大内存、多CPU的复杂应用,G1收集器能平衡吞吐量和响应时间2. 分析JVM内存泄漏的原因和解决方法内存泄漏原因包括静态集合类持有对象引用、未关闭资源、内部类持有外部类引用、缓存未清理等解决方法有及时释放静态集合中的对象引用,关闭文件、数据库连接等资源,避免内部类不必要的引用,定期清理缓存同时,使用工具如VisualVM检测内存泄漏点3. 探讨JVM调优的目标和策略JVM调优目标是提高吞吐量、降低响应时间、减少内存占用和垃圾收集频率策略上,先根据应用特点选择合适的垃圾收集器,合理分配堆内存各区域大小。
通过监控工具分析性能瓶颈,如发现频繁Full GC,可调整堆大小或对象晋升策略还可优化代码,减少内存占用4. 谈谈如何使用JVM监控工具进行性能分析可以使用jstat监控JVM的各种统计信息,如堆各区域的使用情况、垃圾收集频率等jmap可生成堆转储文件,用于分析堆内存中的对象分布VisualVM是功能强大的可视化工具,能实时监控内存、线程、CPU等使用情况,还可进行线程分析、堆转储分析等结合这些工具找出性能瓶颈并进行调优。


