当前位置: 首页 > 科技观察

面试官:说一下JVM常用垃圾回收器的特点、优劣势、使用场景和参数设置

时间:2023-03-19 17:21:43 科技观察

面试官:说说常用的JVM垃圾收集器的特点、优缺点、使用场景和参数设置问垃圾收集器的一些知识点。不管在实际开发中用到多少,对它有更深入的了解是非常有必要的,才能在面试中不被低估。本文对JVM中常用的几种垃圾收集器的主要特点、使用场景和优化建议作一简要介绍。希望能起到招玉的作用,帮助大家入门。NewGenerationCollectorSerialParNewparallelOldGenerationCollectorSerialOldCMSParallelOldNewGenerationandOldGenerationCollectorG1Serial特点串行收集器是最基础的收集器,发展历史最长。JDK1.3.1是HotSpot新一代合集的唯一选择。运行图具有以下特点:面向新生代;使用复制算法;单线程集合;执行垃圾回收时,所有工作线程必须挂起,直到完成;优点:简单高效,因为采用了单线程的方式,不同于其他类型的收集器,单CPU没有上下文切换,效率比较高。缺点:在用户不知情的情况下停止所有工作线程。使用场景Client模式(桌面应用)在用户的桌面应用场景下,可用内存一般都不大,垃圾回收可以在较短的时间内完成。只要不是经常出现,这对于单核服务器来说是可以接受的。在环境方面,Serial收集器没有线程切换开销,可以获得最高的单线程收集效率参数设置-XX:+UseSerialGC:添加这个参数可以显式使用串行垃圾收集器的ParNew特性ParNew收集器实际上是一个Serialcollection多线程版本的收集器与Serial收集器一致,只是它使用多线程进行垃圾收集。RunningDiagram优点:Serial的多线程版本可以更有效的利用系统资源。缺点:和Serial一样,会在用户不知情的情况下停止所有工作线程。在服务器模式下使用它。亮点是除了Serial,目前是唯一的。它可以和CMS收集器一起工作,是一个非常重要的垃圾收集器。参数设置-XX:+UseConcMarkSweepGC:指定使用CMS后,默认使用ParNew作为新生代收集器;-XX:+UseParNewGC:强制指定使用ParNew;-XX:ParallelGCThreads:指定垃圾收集的线程数,默认启用ParNew,收集线程数与CPU数相同;parallelfeaturesParallelScavenge也是新一代的多线程收集器,同样使用了复制算法。与ParNew不同的是,ParallelScavenge收集器的目的是为了实现可控的吞吐量,而ParNew收集器则侧重于尽可能缩短垃圾收集时用户线程的停顿时间。运行示意图具有以下特点:新生代收集器;采用复制算法;多线程收集;重点与其他收集器不同:CMS等收集器的重点是尽可能缩短用户线程在垃圾收集过程中的停顿时间;而ParallelScavenge收集器的目标是实现可控的吞吐量;优点:追求高吞吐量,高效利用CPU,吞吐量优先,控制精准。缺点:应该说是一个特点。追求高吞吐量必须牺牲一些其他的优势,不能兼而有之。ParNew收集器的重点是尽可能缩短用户线程在垃圾收集过程中的停顿时间。本来是10s采集一次,每次停顿100ms。设置好参数后,可能会变成每5s采集一次,每次停顿70ms。停顿时间变短,但回收次数增加。使用场景根据相关特性,我们很容易想到它的使用场景,即当应用程序运行在多CPU上,对停顿时间没有特别高的要求时,程序主要在后台进行计算,没有需要和用户沟通。做太多交互等特别适合ParNew收集器。比如那些执行批处理、订单处理、发薪、科学计算的应用等参数设置-XX:MaxGCPauseMillis:控制最大垃圾回收暂停时间,大于0的毫秒数;-XX:GCTimeRatio:设置垃圾回收总时间与时间的比例,0