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执行期间会对进程产生很大影响,甚至卡顿(电商不适合

  1. 设定了参数HeapDump,OOM的时候会自动产生堆转储文件
  2. 很多服务器备份(高可用),停掉这台服务器对其他服务器不影响
  3. 在线定位(一般小点儿公司用不到)

如果设置了高可用,一般可以提前隔离出这台机器,然后导出堆转储文件,进行分析

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远程连接

  1. 程序启动加入参数:

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

  1. 关闭linux防火墙(实战中应该打开对应端口)

service iptables stop
chkconfig iptables off #永久关闭

  1. windows上打开 jconsole远程连接 192.168.17.11:11111

2. jvisualvm远程连接(常用)

https://www.cnblogs.com/liugh/p/7620336.html (简单做法)

上述代码 T15_FullGC_Problem01.java


  • 连接 jvisualvm


3. jprofiler (收费)

以上是关于JVM调优--03---性能优化步骤常用的jvm图形化界面的主要内容,如果未能解决你的问题,请参考以下文章

JVM性能调优

JVM常用性能分析工具

JVM常用调优参数 ——JVM篇

JVM 性能调优实战之:一次系统性能瓶颈的寻找过程

第七篇:双管齐下,JVM内部优化与JVM性能调优

第七篇:双管齐下,JVM内部优化与JVM性能调优