我猜你肯定是为了面试,现在很多公司都会问这个,虽然你工作了N年JVM调优可能都不会接触到,但我觉得还是有考察的必要的。因为很多时候我们考察一个人不光要考察他的硬实力,还要看他有没有持续学习、深入研究的精神,一只咸鱼是不会看JVM调优的。
JVM调优真的有用吗?能解决什么问题?用肯定是有用的。但是,默认的大部分情况是足够你用的,出了问题应该先从程序找问题,不要让JVM背锅好吗?
我觉得应该很少有面试官会上来就问JVM调优怎么调,毕竟这显得有点奇怪。大概率会这样问
- 如果你的系统CPU/内存占用100%了你怎么办?
- 如果你的系统忽然不能响应了你怎么排查?
- 如果你的系统压测数据上不去你除了加负载还有没有其他的好办法?
这类问题你要回答的满意,肯定会涉及到怎么使用jmap, jstat,JConsole…balabala这些工具来排查和定位问题。那么接下来的问题就引出了两个,
- 请说说你上诉说的这些工具的使用方式
- 比如你定位出了老年代内存一直回收不掉,你应该怎么处理呢?
接下来才会引出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才能实现。设置为同一个就可以防止内存抖动。