因为自己的简历上写着熟悉JVM,于是每次都成了必问,并且问不像之前一样问内存模型了。一般都是会问,JDK8 默认的垃圾回收器是什么? 你都知道哪些垃圾回收器。有没有线上调优经验?线上出现了什么情况,你们进行调优?
这篇文章我不介绍内存模型,以及JVM 基础的知识点了。就垃圾回收器,和线上JVM调优两个问题展开。
# # 第一个问题,jdk 8 默认的垃圾回收器
先看一下都有哪些垃圾回收器
jdk8环境下,默认使用 Parallel Scavenge(新生代)+ ParallelOld(老年代)
再来分析一下为什么问这个问题,如果你熟悉JVM,那连默认的 垃圾回收器,以及一些默认的配置参数都不知道,那你肯定就没调优过。如果这个问题被问住了,那么你简历上的熟悉JVM这个本来的加分项,就会成为减分项。
以及这个问题可以引申出来的几个问题:首先你要知道默认的垃圾回收器,如果你知道,能答出来,肯定就要区分这些垃圾回收器了。第二个问题的话是垃圾回收算法,这个问题也是垃圾回收器区分出来的。不同的垃圾回收器使用的不同的垃圾回收算法,不同的垃圾回收算法又使用与不同的场景。
比方说年轻代,每次GC 要清理很多内容,只保留一小部分,那么使用复制算法是最合适的。根据上边说的 jdk8 使用Parallel Scavenge ,这个垃圾回收器就是使用的复制算法。并且对于一些年轻带频繁GC的场景比如是秒杀系统里边的订单系统,Parallel Scavenge 这个垃圾回收器是多线程的。
# # 线上调优
为什么调优?
首先有一个大前提,调优是为了提高稳定性,稳定性放在首位,其次才是为了提升性能。
这个线上调优,一般不是没事干了,看看线上的情况。一般来讲,就是有一些症状,才去进行的(当然了,上线前肯定也要压力测试,将能发现能解决的问题给解决了。) 就像生病了才去医院看一样。而感冒发烧则是症状。
需要进行JVM调优的症状有以下这些:比如 运维人员看到了cpu 飙升,比如系统 每隔一段时间就会变慢,过几分钟就好了。
再严重一点,服务器过一段时间就会宕机。而且很有周期性。
调优一般要解决什么问题?
发现内存泄露,内存泄露会引发频繁的GC,内存泄露就是这块内存永远的被占用着。GC 到了一定条件就会触发。对于排查细节,则在下边 模拟问题产生,排查解决问题里边有一篇文章。
怎么调优:看一个真实的线上调优的案例
# # 模拟问题产生,排查解决问题
点击这篇文章
这篇文章里边会介绍一些常用的问题定位的工具。
# # JVM 调优规划
https://www.520mwx.com/view/39060