Java核心技术面试精讲
杨晓峰
前Oracle首席工程师
立即订阅
43250 人已学习
课程目录
已完结 43 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 以面试题为切入点,有效提升你的Java内功
免费
模块一 Java基础 (14讲)
第1讲 | 谈谈你对Java平台的理解?
第2讲 | Exception和Error有什么区别?
第3讲 | 谈谈final、finally、 finalize有什么不同?
第4讲 | 强引用、软引用、弱引用、幻象引用有什么区别?
第5讲 | String、StringBuffer、StringBuilder有什么区别?
第6讲 | 动态代理是基于什么原理?
第7讲 | int和Integer有什么区别?
第8讲 | 对比Vector、ArrayList、LinkedList有何区别?
第9讲 | 对比Hashtable、HashMap、TreeMap有什么不同?
第10讲 | 如何保证集合是线程安全的? ConcurrentHashMap如何实现高效地线程安全?
第11讲 | Java提供了哪些IO方式? NIO如何实现多路复用?
第12讲 | Java有几种文件拷贝方式?哪一种最高效?
第13讲 | 谈谈接口和抽象类有什么区别?
第14讲 | 谈谈你知道的设计模式?
模块二 Java进阶 (16讲)
第15讲 | synchronized和ReentrantLock有什么区别呢?
第16讲 | synchronized底层如何实现?什么是锁的升级、降级?
第17讲 | 一个线程两次调用start()方法会出现什么情况?
第18讲 | 什么情况下Java程序会产生死锁?如何定位、修复?
第19讲 | Java并发包提供了哪些并发工具类?
第20讲 | 并发包中的ConcurrentLinkedQueue和LinkedBlockingQueue有什么区别?
第21讲 | Java并发类库提供的线程池有哪几种? 分别有什么特点?
第22讲 | AtomicInteger底层实现原理是什么?如何在自己的产品代码中应用CAS操作?
第23讲 | 请介绍类加载过程,什么是双亲委派模型?
第24讲 | 有哪些方法可以在运行时动态生成一个Java类?
第25讲 | 谈谈JVM内存区域的划分,哪些区域可能发生OutOfMemoryError?
第26讲 | 如何监控和诊断JVM堆内和堆外内存使用?
第27讲 | Java常见的垃圾收集器有哪些?
第28讲 | 谈谈你的GC调优思路?
第29讲 | Java内存模型中的happen-before是什么?
第30讲 | Java程序运行在Docker等容器环境有哪些新问题?
模块三 Java安全基础 (2讲)
第31讲 | 你了解Java应用开发中的注入攻击吗?
第32讲 | 如何写出安全的Java代码?
模块四 Java性能基础 (3讲)
第33讲 | 后台服务出现明显“变慢”,谈谈你的诊断思路?
第34讲 | 有人说“Lambda能让Java程序慢30倍”,你怎么看?
第35讲 | JVM优化Java代码时都做了什么?
模块5 Java应用开发扩展 (4讲)
第36讲 | 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?
第37讲 | 谈谈Spring Bean的生命周期和作用域?
第38讲 | 对比Java标准NIO类库,你知道Netty是如何实现更高性能的吗?
第39讲 | 谈谈常用的分布式ID的设计方案?Snowflake是否受冬令时切换影响?
周末福利 (2讲)
周末福利 | 谈谈我对Java学习和面试的看法
周末福利 | 一份Java工程师必读书单
结束语 (1讲)
结束语 | 技术没有终点
Java核心技术面试精讲
登录|注册

第28讲 | 谈谈你的GC调优思路?

杨晓峰 2018-07-10
我发现,目前不少外部资料对 G1 的介绍大多还停留在 JDK 7 或更早期的实现,很多结论已经存在较大偏差,甚至一些过去的 GC 选项已经不再推荐使用。所以,今天我会选取新版 JDK 中的默认 G1 GC 作为重点进行详解,并且我会从调优实践的角度,分析典型场景和调优思路。下面我们一起来更新下这方面的知识。
今天我要问你的问题是,谈谈你的 GC 调优思路?

典型回答

谈到调优,这一定是针对特定场景、特定目的的事情, 对于 GC 调优来说,首先就需要清楚调优的目标是什么?从性能的角度看,通常关注三个方面,内存占用(footprint)、延时(latency)和吞吐量(throughput),大多数情况下调优会侧重于其中一个或者两个方面的目标,很少有情况可以兼顾三个不同的角度。当然,除了上面通常的三个方面,也可能需要考虑其他 GC 相关的场景,例如,OOM 也可能与不合理的 GC 相关参数有关;或者,应用启动速度方面的需求,GC 也会是个考虑的方面。
基本的调优思路可以总结为:
理解应用需求和问题,确定调优目标。假设,我们开发了一个应用服务,但发现偶尔会出现性能抖动,出现较长的服务停顿。评估用户可接受的响应时间和业务量,将目标简化为,希望 GC 暂停尽量控制在 200ms 以内,并且保证一定标准的吞吐量。
掌握 JVM 和 GC 的状态,定位具体的问题,确定真的有 GC 调优的必要。具体有很多方法,比如,通过 jstat 等工具查看 GC 等相关状态,可以开启 GC 日志,或者是利用操作系统提供的诊断工具等。例如,通过追踪 GC 日志,就可以查找是不是 GC 在特定时间发生了长时间的暂停,进而导致了应用响应不及时。
这里需要思考,选择的 GC 类型是否符合我们的应用特征,如果是,具体问题表现在哪里,是 Minor GC 过长,还是 Mixed GC 等出现异常停顿情况;如果不是,考虑切换到什么类型,如 CMS 和 G1 都是更侧重于低延迟的 GC 选项。
通过分析确定具体调整的参数或者软硬件配置。
验证是否达到调优目标,如果达到目标,即可以考虑结束调优;否则,重复完成分析、调整、验证这个过程。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Java核心技术面试精讲》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(20)

  • clz1341521
    1,首先通过printgcdetail 查看fullgc频率以及时长
    2,通过dump 查看内存中哪些对象多,这些可能是引起fullgc的原因,看是否能优化
    3,如果堆大或者是生产环境,可以开起jmc 飞行一段时间,查看这期间的相关数据来订位问题

    作者回复: 不错

    2018-08-10
    22
  • 潇洒的毅小峰
    老师要快点更新啊感觉到26更不完,校招马上开始了呢,学的不亦乐乎

    作者回复: 汗

    2018-07-11
    4
  • 涛哥迷妹
    感谢了这么晚还在回复.点赞了
    2018-07-18
    2
  • 涛哥迷妹
    FullGc可通过Gc日志 或者添加fullgc前后堆dump 查看引起fullgc原因 CPU飙升可以看看jstack

    作者回复: 不错思路,如果堆太大dump不现实呢;除了gc日志,还有没有其他工具?

    2018-07-17
    1
    2
  • Jacky.L
    请问不同年代的GC会分别进行标记吗?还是说不同年代会对整个堆整体标记一次
    2018-12-14
    1
  • Pantheon
    杨老师能不能具体讲讲cms,这个垃圾回收似乎用的还挺多的,昨天上官网介绍的也不是很详细能不能说说原理以及参数优化的东西,感谢了
    2018-07-19
    1
  • Honey拯救世界
    这一集有难度了,平时接触得少,初步读来能吸收的真有限。:(
    2018-07-18
    1
  • 三口先生
    jmap指令加不加live,分析是否是内存泄漏或者是请求的内存处理不过来等原因。

    作者回复: 嗯,不过,加live会触发full gc吧

    2018-07-11
    1
  • 西兹兹
    字符串排重的特性, 是JDK哪个版本提供的?
    2019-11-11
  • 子不语
    老师,咨询个问题,我通过jinfo -flag +PrintGC PID jinfo -flag +PrintGCDetails PID,没办法指定路径,gc日志输出在哪里的,找不到。
    2019-06-13
  • Dimple
    前面的课程还行,接触了垃圾收集这几节课,感觉这课程真的很赞,把我很多自信都打败了,要好好学习
    2019-04-04
  • 半个西瓜
    老师,为什么 G1 对大堆非常友好。是因为运行机制也需要浪费一定的空间?

    作者回复: 说来话长,简单说,除了尽量让更多GC工作并发进行,G1的内存区域是如棋盘一样的一个个region,非连续性内存划分以及一些设计,让相当一部分工作处理时间与堆大小不是很相关(当然也不是完全如此)

    2019-01-16
  • Sunny Li
    老师,我想问一下除了dump文件和gc日志,还可以使用什么工具可以用'jconsole吗,具体关注那几个参数
    2018-09-24
  • 蘅哼
    -XX:+PrintGCDetails
    -XX:+PrintGCDateStamps
    这两个参数可用于CMS GC下吗?还是只能用于G1 GC?

    作者回复: 当然可以,无关的;建议随手试验一下,顺道熟悉各种gc怎么启用

    2018-08-15
  • 于海
    这个问题真的很难,如果没有实际的生产经验,真的很难回答,麻烦老师能给提供一些参考方案吗?谢谢您~
    2018-07-27
  • 涛哥迷妹
    如果dump堆太大.我觉得可以先通过jmap -heap看下是哪个区占用特别多.再看下对内存占用前20到30的大对象.然后结合jstat gccuase 查看下引起Gc原因 .目前想到这些思路请问还有更好的工具?jconsole jdb远程连接查看占用?
    2018-07-18
  • 涛哥迷妹
    请问Remembered Set和cardtable关系是怎么样的?他们之间是如何协作一起完成g1 gc的?

    作者回复: 我理解card table是remembered set的一种实现

    2018-07-16
  • 涛哥迷妹
    Remembered Set和cardtable的关系是什么?他们什么时候使用能说明下吗
    2018-07-16
  • 涛哥迷妹
    Remembered Set和cardtable 是什么关系什么时候使用能说明下这个过程吗
    2018-07-16
  • 小刚
    老师讲的很到位,看得不是很明白,得多看几遍。
    2018-07-10
收起评论
20
返回
顶部