如何应对面试官的JVM调优问题

时间:2022-07-23
本文章向大家介绍如何应对面试官的JVM调优问题,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

为什么要进行JVM调优

我猜你肯定是为了面试,现在很多公司都会问这个,虽然你工作了N年JVM调优可能都不会接触到,但我觉得还是有考察的必要的。因为很多时候我们考察一个人不光要考察他的硬实力,还要看他有没有持续学习、深入研究的精神,一只咸鱼是不会看JVM调优的。

JVM调优真的有用吗?能解决什么问题?

用肯定是有用的。但是,默认的大部分情况是足够你用的,出了问题应该先从程序找问题,不要让JVM背锅好吗?

在这里插入图片描述

如何应对面试官问的JVM调优的问题

我觉得应该很少有面试官会上来就问JVM调优怎么调,毕竟这显得有点奇怪。大概率会这样问

  1. 如果你的系统CPU/内存占用100%了你怎么办?
  2. 如果你的系统忽然不能响应了你怎么排查?
  3. 如果你的系统压测数据上不去你除了加负载还有没有其他的好办法?

这类问题你要回答的满意,肯定会涉及到怎么使用jmap, jstat,JConsole......balabala这些工具来排查和定位问题。那么接下来的问题就引出了两个,

  1. 请说说你上诉说的这些工具的使用方式
  2. 比如你定位出了老年代内存一直回收不掉,你应该怎么处理呢?

接下来才会引出JVM调优的问题

  1. 你还知道JVM有其他的什么可以调优的参数选项吗?

JVM调优参数

-Xmx4g –Xms4g –Xmn1200m –Xss512k -XX:NewRatio=4 -XX:SurvivorRatio=8 -XX:PermSize=100m -XX:MaxPermSize=256m -XX:MaxTenuringThreshold=15

如果是堆内存不够: 尝试调整-Xmx–Xms选项,这个值代表最大堆内存和初始化堆内存的大小

如果是想提高系统的并发性能: 可以尝试降低–Xss的值,这个值代表每个线程的堆栈大小,JDK5.0以后每个线程堆栈大小为1MB,以前每个线程堆栈大小为256K。应根据应用线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。别调太小了,太小了栈溢出了。

调整对象在年轻代存活的时间: -XX:MaxTenuringThreshold 默认值15,这个值代表垃圾最大年龄,对于老年代比较多的应用,减少这个值可以提高效率。对于年轻代比较多的应用,增加这个值可以增加数据在年轻代即被回收的概率。这个值调整需要尤其注意,设置小了可能引发老年代频繁full GC,设置大了可能导致某些数据长期存活于新生代,每一次Minor GC都要拷贝它,很影响性能的。

调整CMS垃圾回收器并行线程数: -XX:ConcGCThreads=4 CMS垃圾回收器并行线程线,推荐值为CPU核心数。

记得把最小值和最大值设置成同一个: 应尽量把永久代的初始值与最大值设置为同一值,因为永久代的大小调整需要进行FullGC才能实现。设置为同一个就可以防止内存抖动