分代垃圾回收器常用调优参数
调优追求的指标:吞吐量(增加)和响应速度(减少stop the word时间)
吞吐量:业务代码执行时间/总的执行时间
(总的执行时间=业务代码执行时间+GC时间)
步骤:
1.根据场景选择垃圾回收器
2.保证一年中99.9时间程序正常跑。(堆初始值和堆最大值选定)
3.-XX:log 要有日志,压测如果达不到效果,看日志。
调优工具:
调优操作:
此处用的代码如下
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadPoolExecutor;
import static java.util.concurrent.TimeUnit.SECONDS;
public class FullgcDemo {
private static ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(
50,new ThreadPoolExecutor.DiscardOldestPolicy());
public static void main(String args[])throws Exception{
executor.setMaximumPoolSize(50);
for(;;){
trackInfo();
Thread.sleep(100);
}
}
private static void trackInfo(){
List<F10Info> taskList = pullF10Info();
taskList.forEach(f10 ->{
executor.scheduleWithFixedDelay(()->{
f10.brag();
},2,3,SECONDS);
}
);
}
private static List<F10Info>pullF10Info(){
List<F10Info> taskList = new ArrayList<>();
for (int i=0;i<100;i++){
F10Info f10 = new F10Info();
taskList.add(f10);
}
return taskList;
}
private static class F10Info{
String comName = "乐视网";
String stockNo = "300104";
String title = "贾跃亭否认跑路";
int pushNum = 1;
public void brag(){}
}
}
cmd中输入jps得到如下数据,36228就是启动的FullgcDemo进程
使用jinfo命令查看,这些信息告诉了你如何使用jinfo
输入jinfo 36228 检测问题
输入jinfo -flags36228,由于是报错,会出现和上图相同的情况。
正常情况如下图所示,显示一些jvm信息
输入jstat得到jstat的用法
输入jstat -gcutil 17696 得到gc相关信息
S0 S1 E 分别为from区,to区,eden区。
若在后面加上1000 则1秒打印一次,ctrl+c退出打印使用jstack得到jstack的用法
比如jstack -l 17696 就是检测关于锁的信息。
正确的信息如下
jmap打印堆中的对象信息
jmap -histo:live 17696打印活着的对象
下图可以看到1234对象占用了很多资源,一直没有回收回去,是程序卡住的原因。
jmap -heap 17696 打印堆中信息
正确信息如下。
接下来拿dump信息。
先输入D:
转到D盘目录下
输入如下语句
jmap -dump:format=b,file=17696.dump 17696
使用图形化界面
可以以管理员身份运行cmd
输入d:
再输入jvisualvm
打开软件
左上角文件,装入 点开你的dump文件。下面就是堆中信息。
打开类中信息,与jmap -histo:live 17696得到的信息是相同的
输入jhat -J-Xmx128M 17696.dump
可以在网页中输入localhost:7000看参数
或者使用jcmd进行查询
jcmd 16444 Thread.print 打印线程。
创建dump文件:jcmd 16444 GC.heap_dump d:\16444.jcmd
还有一个调优工具叫Arthas(阿里的)
https://arthas.aliyun.com/doc/