本文介绍是基于jdk1.8版本左右包括之前的版本,且虚拟机是hotspot。
1、Serial+Serial Old ,Serial是jdk诞生就有的,这是单线程回收,并且垃圾回收的时候应用线程会停止。
2、Parnew+CMS 这是并发回收。垃圾回收的时候应用线程不停止。
3、Parallel Scavenge+Parallel Old 这是多线程回收,并且垃圾回收的时候应用线程会停止。
如果你不设置垃圾回收器,默认是 Parallel scavenge,parallel Old 组合;跟Serial的区别就是这里是多线程的;相同的是服务器其他线程会停顿;
设置启动命令 java -XX:+PrintCommandLineFlags xxxApp.jar 会打印出默认设置的启动参数,如下图:
ParNew+CMS: 能实现响应时间优先;
Parallel Scavenge +parallel Old:能实现吞吐量优先;
如果使用的jdk已经是jdk1.8了,那么直接使用G1垃圾回收器即可,响应时间跟吞吐量都能达到平衡。
jvm调优前的基础概念:
内存泄漏memory leak:(就是有个废弃的东西占用在那里,也没人回收它)。
内存溢出out of memory:(不断的new对象,空间不够了)。
吞吐量:用户代码时间 /(用户代码执行时间 + 垃圾回收时间)。
响应时间:STW越短,响应时间越好。
所谓调优,首先确定,追求啥?吞吐量优先,还是响应时间优先?还是在满足一定的响应时间的情况下,要求达到多大的吞吐量。
吞吐量优先:科学计算就是吞吐量优先。数据挖掘也是吞吐量优先,吞吐量优先的一般:(Parallel Scavenge +parallel Old组合的垃圾回收器)。
响应时间优先:网站、 GUI、 API接口等 (jdk1.8就用 G1垃圾回收器)。