Java最新面试官:怎么做JDK8的垃圾收集器的调优?,层层深入

写在最后

为了这次面试,也收集了很多的面试题!

以下是部分面试题截图

Java程序员秋招三面蚂蚁金服,我总结了所有面试题,也不过如此

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

面试官又追问到:如果是要求高吞吐量的应用,使用较大内存并且有多核CPU,应该选择哪种垃圾收集器呢?我快速的回答:Parallel收集器。看着面试官期待的眼神,我又详细解释到:

Parallel收集器

Parallel收集器是类似于Serial收集器的分代收集器,主要区别是在垃圾回收的时候使用了多个线程进行加速垃圾的收集。所以,对于使用较大内存并且有多核CPU的环境更加适合。

我一边说着,一边在纸上画了起来:

Server模式的JVM默认的垃圾收集器就是Parallel收集器,也可以使用JVM参数**-XX:+UseParallelGC**启用。启用Parallel收集器后默认情况下,Minor垃圾收集(针对年轻代的垃圾收集)和Major垃圾收集(针对老年代的垃圾收集)都是并行执行的,可以进一步减少垃圾收集的开销。

Parallel收集器可以通过JVM参数指定最大垃圾收集暂停时间、吞吐量(用户代码运行时间/(用户代码运行时间+垃圾收集运行时间))和堆占用空间的目标值:

  • -XX:MaxGCPauseMillis:最大垃圾收集暂停时间,单位为毫秒,如:-XX:MaxGCPauseMillis=200,表示垃圾收集暂停时间最大为200毫秒。默认情况下,没有指定最大垃圾收集暂停时间。如果指定了暂停时间目标,则会调整堆大小与垃圾收集相关的其他参数,使垃圾收集的暂停时间短于指定值。这些调整可能导致降低应用的整体吞吐量,也有可能无法始终满足所指定的最大垃圾收集暂停时间目标。

  • -XX:GCTimeRatio:吞吐量大小,如:-XX:GCTimeRatio=19,表示将垃圾收集运行时间的目标设定为应用总运行时间(用户代码运行时间+垃圾收集运行时间)的1/(1+19),即5%。默认值为99,垃圾收集的目标时间占应用总运行时间的1/(1+99),即1%。

  • -Xmx:堆占用的最大占用空间,如:-Xmx1G,表示堆占用的最大占用空间为1GB。另外,Parallel收集器还有一个隐含的目标:只要满足其他目标的同时,把堆占用内存的大小最小化。

这三个目标是有优先级的:

  1. 高优先级:最大垃圾收集暂停时间

  2. 中优先级:吞吐量目标

  3. 低优先级:最小堆占用内存目标

Parallel收集器按照指定的目标对分代大小和底层进行自动调节,尽量达到指定的目标,但不保证百分之百能达到。

面试官又追问到:如果同样是使用较大内存并且有多核CPU,但是要求垃圾收集暂停时间要尽可能短的Web应用,应该选择哪种垃圾收集器呢?我稍微思考了一下,回答:CMS收集器。看着面试官期待的眼神,我又详细解释到:

CMS收集器

CMS(Concurrent Mark Sweep)收集器是为那些要求垃圾收集暂停时间尽可能短,并且可以和垃圾收集器共享CPU资源的应用设计的。具有相对较大的内存使用并有多核CPU的应用,往往会更适合CMS收集器的使用。可以使用JVM参数**-XX:+UseConcMarkSweepGC**启用CMS收集器,启用后同时作用于Minor垃圾收集(针对年轻代的垃圾收集)和Major垃圾收集(针对老年代的垃圾收集)。

CMS收集器尝试通过使用单独的垃圾收集器线程在执行用户线程的同时并跟踪可访问对象,来减少由于Major垃圾收集而导致的暂停时间。在每个Major垃圾收集周期中,CMS收集器会在收集开始时暂停所有用户线程一小段时间,然后在收集的中期再次暂停。第二个暂停往往是两个暂停中较长的一个,在两个暂停之间都使用多个线程并行做收集工作的。所以,CMS收集器的垃圾收集过程分为以下四个步骤:

  1. 初始标记(CMS initial mark):这个步骤会暂停所有用户线程,但耗时非常短,标记GC Root直接关联的对象。

  2. 并发标记(CMS concurrent mark):这个步骤耗时较长,但用户线程可同时运行,标记至GC Root有可达路径的对象。

  3. 重新标记(CMS remark):这个步骤会暂停所有用户线程,但耗时比较短。由于步骤2用户线程同步运行,所以要修正在步骤二中用户线程同步运行产生对象标记的变动。

  4. 并发清除(CMS concurrent sweep):这个步骤耗时较长,但用户线程可同时运行。

我一边说着,一边在纸上画了起来:

面试官继续追问到:如果堆中有超过50%的活跃对象,分配对象和对象升代的频率较高,垃圾收集停顿时间大于0.5秒,应该选择哪种垃圾收集器呢?我稍微思考了一下,回答:G1收集器。看着面试官期待的眼神,我又详细解释到:

G1收集器

G1(Garbage-First)收集器是一款主要面向服务端应用的垃圾收集器,适用于具有大内存的多核CPU的服务器。它尝试在高概率下同时满足较小的垃圾收集暂停时间和较高的吞吐量。所有堆相关的操作(如:全局标记)与用户线程同时运行,这样可以避免随着堆内存的大小的增加垃圾收集的停顿时间也跟着增加。

总结:绘上一张Kakfa架构思维大纲脑图(xmind)

image

其实关于Kafka,能问的问题实在是太多了,扒了几天,最终筛选出44问:基础篇17问、进阶篇15问、高级篇12问,个个直戳痛点,不知道如果你不着急看答案,又能答出几个呢?

若是对Kafka的知识还回忆不起来,不妨先看我手绘的知识总结脑图(xmind不能上传,文章里用的是图片版)进行整体架构的梳理

梳理了知识,刷完了面试,如若你还想进一步的深入学习解读kafka以及源码,那么接下来的这份《手写“kafka”》将会是个不错的选择。

  • Kafka入门

  • 为什么选择Kafka

  • Kafka的安装、管理和配置

  • Kafka的集群

  • 第一个Kafka程序

  • Kafka的生产者

  • Kafka的消费者

  • 深入理解Kafka

  • 可靠的数据传递

  • Spring和Kafka的整合

  • SpringBoot和Kafka的整合

  • Kafka实战之削峰填谷

  • 数据管道和流式处理(了解即可)

image

image

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

ps://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**

需要这份系统化的资料的朋友,可以点击这里获取

  • 24
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
面试官:怎么jdk8的垃圾收集器调优(面试常问)。 对于jdk8的垃圾收集器调优,需要我们了解垃圾收集器的工作原理和相关的参数配置。下面我将介绍几个常见的调优方法。 首先,我们可以通过选择合适的垃圾收集器来优化性能。jdk8提供了多个垃圾收集器,如Serial收集、Parallel收集和CMS收集等。根据应用的特性和需求,选择合适的垃圾收集器可以提高垃圾回收效率。 其次,我们可以调整垃圾收集器的参数来达到更好的性能。例如,可以通过设置-Xms和-Xmx参数调整堆的大小,合理分配内存资源。同时,可以通过设置-Xmn参数来调整新生代的大小,以及通过-XX:NewRatio参数来调整新生代和老年代的比例。 另外,我们还可以使用GC日志来分析垃圾收集器的行为。通过打开GC日志并使用工具分析日志信息,可以获取到各个垃圾收集阶段的耗时、吞吐量等指标,从而更好地进行优化。 此外,jdk8还引入了元空间(Metaspace)来替代永久代(PermGen),我们可以通过调整-XX:MetaspaceSize和-XX:MaxMetaspaceSize参数来优化元空间的大小,以减少垃圾回收的次数。 最后,我们还可以考虑使用一些第三方工具来辅助调优,如VisualVM和jstat等。这些工具可以提供更详细的性能信息和可视化界面,帮助我们更全面地进行垃圾收集器调优工作。 总结而言,对于jdk8的垃圾收集器调优,我们需要理解垃圾收集器的工作原理和配置参数,并根据应用的需求和特点选择合适的垃圾收集器。通过调整参数、分析GC日志以及使用辅助工具,我们可以优化垃圾收集器的性能,提高应用的运行效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值