聊一聊JVM性能调优
我的程序需要JVM性能调优吗?
如果JVM频繁fullGC,时停过长,出现outOfMemeory,系统响应与吞吐量不高,就该考虑JVM性能调优。
满足下面的情况,一般不需要调优
1.Minor GC 执行时间不到 50ms;
2.Minor GC 执行不频繁,约 10 秒一次;
3.Full GC 执行时间不到 1s;
4.Full GC 执行频率不算频繁,不低于 10 分钟 1 次;
我要从哪方面进行性能调优
为了提升系统的性能,我们需要从各个层面去优化,除了JVM调优,还可以从其他层面优化。优先考虑从代码层面与数据库层面进行优化。

JVM调优的统一标准是什么
很抱歉,没有这玩意。JVM性能调优取决于你的实际系统情况,不是网上随便拷贝的一个性能参数,然后跑起来就行。JVM调优需要你先记录目前的系统相应参数、然后调整JVM的参数,然后再压测。比较上一次的结果,看看是否达到预期目标。一遍遍的比较与调整,非常繁琐。
阿里JVM性能调优建议
JVM性能调优目的主要是为了优化垃圾回收器,从而使得我们运行程序时,使用更少的内存与更低的延迟,却能会得到更大的吞吐量。
性能参数指标

JVM调优原则

JVM性能调优参照流程图

常用JVM性能调优参数


常用性能调优工具
1.命令行工具jps
jps -q 输出pid
jps -l: 输出应用程序主类完整 package 名称或 jar 完整名称.
jps -v: 列出 jvm 参数
jps -m 显示main方法启动时的传入参数
2.命令行工具jstat
jstat -class pid:统计class数量、内存空间,耗时
jstat -compiler pid:统计编译成功、失败的数量等信息
jstat -gc pid:垃圾回收统计
jstat -gccapacity pid:垃圾回收器内存空间统计
jstat -gcmetacapacity pid:元数据内存空间统计
jstat -gcnew pid:新生代垃圾回收统计
jstat -gcnewcapacity pid:新生代内存空间统计
jstat -gcold pid:老年代垃圾回收统计
jstat -gcoldcapacity pid:老年代内存空间统计
jstat -gcutil pid:总垃圾回收统计
jstat -printcompilation pid:JVM编译方法统计
3.命令行工具jinfo
jinfo -sysprops pid :可以查看由 System.getProperties()取得的参数
jinfo -flags pid:查看曾经操作过的一些参数
jinfo -flag name pid:查看某个具体属性的值,如jinfo -flag MaxHeapSize 65535
jinfo –flag -[参数] pid 可以修改参数:如jinfo -flag +PrintGC 63535
4.命令行工具jmap
jmap pid:查看进程的内存映像信息
jmap -heap pid:显示Java堆详细信息
jmap -histo:live pid:显示堆中对象的统计信息
jmap -clstats pid:打印类加载器信息
jmap -finalizerinfo pid:打印等待终结的对象信息
jmap -dump:format=b,file=heapdump.phrof pid:用于生成堆转储快照(一般称为 heapdump 或 dump 文件)。jmap 的作用并不仅仅是为了获取 dump 文件,它还可以查询 finalize 执行队列、Java 堆的详细信息,如空间使用率、当前用的是哪种收集器等。例子:jmap -dump:format=b,file=/opt/1.hprof 12023
Sun JDK 提供 jhat(JVM Heap Analysis Tool)命令与 jmap 搭配使用,来分析 jmap 生成的堆转储快照。
5.命令行工具jstack
用于生成当前时刻的线程快照,
jstack pid:打印堆栈信息到控制台
jstack -F pid:当正常输出的请求不被响应时,强制输出线程堆栈
jstack -m pid: 如果调用到本地方法的话,可以显示C/C++的堆栈
jstack -l pid: 除堆栈外,显示关于锁的附加信息,在发生死锁时可以用jstack -l pid来观察锁持有情况
6.可视化工具Jconsole
可以非常直观的考到线程与内存的情况

7.可视化工具visualvm


8.Jmeter压测工具
1.本地下载地址
https://jmeter.apache.org/download_jmeter.cgi
2.插件管理器下载
JMeter-Plugins.org
3.创建线程组
线程数:并发线程数
Ramp-Up时间:表示启动所有线程需要的时间
循环次数:每个线程要发送多少次请求。
调度器:循环次数与调度器选择一个进行配置即可,持续时间填个60,就代表1分钟

4.创建HTTP请求

5.创建监听器,输出结果


性能调优总结
上线前,可以通过Jmeter进行压测,然后进行性能调优。上线后,通过JDK自带的这些性能调优工具,进行监测后续情况。性能调优没有捷径,也没有统一的参数,只能自己设置参数后,使用压测工具与监测工具,一遍遍查看效果。

