JVM调优--03---性能优化步骤常用的jvm图形化界面
Posted 高高for 循环
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM调优--03---性能优化步骤常用的jvm图形化界面相关的知识,希望对你有一定的参考价值。
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
性能优化步骤
- 第一步:性能监控
- 第二步:性能分析
- 第三步:性能调优
第一步:性能监控
第二步:性能分析
第三步:性能调优
实际案例
业务背景:
- 从数据库中读取信用数据,套用模型,并把结果进行记录和传输
1. 代码:
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* 从数据库中读取信用数据,套用模型,并把结果进行记录和传输
*/
public class T15_FullGC_Problem01
private static class CardInfo
BigDecimal price = new BigDecimal(0.0);
String name = "张三";
int age = 5;
Date birthdate = new Date();
public void m()
private static ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(50,
new ThreadPoolExecutor.DiscardOldestPolicy());
public static void main(String[] args) throws Exception
executor.setMaximumPoolSize(50);
for (;;)
modelFit();
Thread.sleep(100);
private static void modelFit()
List<CardInfo> taskList = getAllCardInfo();
taskList.forEach(info ->
// do something
executor.scheduleWithFixedDelay(() ->
//do sth with info
info.m();
, 2, 3, TimeUnit.SECONDS);
);
private static List<CardInfo> getAllCardInfo()
List<CardInfo> taskList = new ArrayList<>();
for (int i = 0; i < 100; i++)
CardInfo ci = new CardInfo();
taskList.add(ci);
return taskList;
2.设置参数
java -Xms200M -Xmx200M -XX:+PrintGC T15_FullGC_Problem01
3.一般是运维团队首先受到报警信息(CPU Memory)
4.top命令观察到问题:内存不断增长 CPU占用率居高不下
观察的是进程
5. top -Hp 观察进程中的线程,哪个线程CPU和内存占比高
观察进程中的线程
top -Hp 1364
6. jstack 定位线程状况
jstack 1591
- jps定位具体java进程
- jstack 定位线程状况,重点关注:WAITING BLOCKED
eg.waiting on <0x0000000088ca3310> (a java.lang.Object)
假如有一个进程中100个线程,很多线程都在waiting on ,一定要找到是哪个线程持有这把锁 怎么找?
- 搜索jstack dump的信息,找 ,看哪个线程持有这把锁,这个线程一直RUNNABLE,其他线程都在waiting on
这也是为什么阿里规范里规定,线程的名称(尤其是线程池)都要写有意义的名称
- 怎么样自定义线程池里的线程名称?(自定义ThreadFactory)
7. jinfo pid
- 把这个进程jvm的一些详细信息打印出来
jvm的一些启动参数
8. 动态观察gc情况
1. 动态观察gc情况 / 阅读GC日志发现频繁GC
- jstat -gc 4655 500 : 每个500个毫秒打印GC的情况
2. 可视化界面
- jconsole/jvisualVM – (jdk自带,免费)
- Jprofiler --(最好用,但收费 )
如果面试官问你是怎么定位OOM问题的?
如果你回答用图形界面(错误)—因为图形化界面监控影响jvm运行效率
1:已经上线的系统不用图形界面用什么?(cmdline arthas)
2:图形界面到底用在什么地方?测试!测试的时候进行监控!(压测观察)
图形界面观察jvm,一般是在压测的时候才用到.
9. jmap - histo 查找有多少对象产生
- jmap - histo 4655 | head -20,查找此进程有多少对象产生
观察那些对象长期存在,且随着时间推移还越来越多,定位到具体的类.
10 . jmap -dump:format=b,file=xxx pid :导出堆转储文件
jmap -dump:format=b,file=xxx pid :
线上系统,内存特别大,jmap执行期间会对进程产生很大影响,甚至卡顿(电商不适合)
- 设定了参数HeapDump,OOM的时候会自动产生堆转储文件
- 很多服务器备份(高可用),停掉这台服务器对其他服务器不影响
- 在线定位(一般小点儿公司用不到)
如果设置了高可用,一般可以提前隔离出这台机器,然后导出堆转储文件,进行分析
11. 使用MAT / jhat /jvisualvm 进行dump文件分析
- https://www.cnblogs.com/baihuitestsoftware/articles/6406271.html
- jhat -J-mx512M xxx.dump
- http://192.168.17.11:7000拉到最后:找到对应链接 可以使用OQL查找特定问题对象
12. 找到代码的问题
常用的jvm图形化界面
1. jconsole远程连接
- 程序启动加入参数:
java -Djava.rmi.server.hostname=192.168.17.11 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=11111 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false XXX
2.如果遭遇 Local host name unknown:XXX的错误,修改/etc/hosts文件,把XXX加入进去
192.168.17.11 basic localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
- 关闭linux防火墙(实战中应该打开对应端口)
service iptables stop
chkconfig iptables off #永久关闭
- windows上打开 jconsole远程连接 192.168.17.11:11111
2. jvisualvm远程连接(常用)
上述代码 T15_FullGC_Problem01.java
- 连接 jvisualvm
3. jprofiler (收费)
以上是关于JVM调优--03---性能优化步骤常用的jvm图形化界面的主要内容,如果未能解决你的问题,请参考以下文章