zoukankan      html  css  js  c++  java
  • JAVA性能优化工具小记

    好记性不如烂笔头,戊戌年的最后一个工作日,把自己平时在开发过程中使用的一些java性能优化工具做一个简单的小结,

    主要包括 jvisualvm、jfr、gdb和查看内存对象信息的几个linux命令。

    注:当前系统属性 Mac OS X 10.13.6,jdk版本 1.8.0_151

    1:jvisualvm(当前java自带的工具)

    可以看到jvisualvm不仅支持本地应用程序的追踪还支持远程。

    然后打开对应的本地项目:

     这里面确实有很多项目的信息,CPU、堆栈信息等。

    我目前使用它就是用它的抽样器,查看当前项目里的对象数及对象占用的内存大小。

    这样对项目中某个对象个数过多或者对象过大,就可以方便的查看到,然后去优化它。

    2:JFR

    jfr的优点:

    VisualVM功能强大,支持图形化界面操作,可以很快定位代码问题。但是它对应用性能的影响也非常大,所以不适合在生产环境下使用。

    还有这些软件(比如GDB(下面介绍))要attach到jvm进程上,生产环境一般网络隔离,很难做到。

    使用jfr不需要在现有应用上额外添加任何参数、重启进程等,直接在命令行执行即可,实时生效,100%无入侵,且稳定可靠,不影响线上应用运行。

     jfr的使用:

    2.1:本地使用:

    1:需要在项目jvm加上配置 vm options:-XX:+UnlockCommercialFeatures -XX:+FlightRecorder

    2:打开jmc

    3:打开对应的进程ID,就可以追踪本项目的堆栈、CPU等信息

    2.2:在服务器上使用:

    1:由于JFR需要JDK的商业证书,这一步需要解锁jdk的商业特性:

      jcmd <PID> VM.unlock_commercial_features

    2:启动jrf,开始输出jfr文件

      jcmd <PID> JFR.start name=test duration=60s filename=/tmp/output.jfr

    3:拿到jfr文件后,在本地打开jmc图形化工具后,选择文件直接打开,然后就可以看到服务器上duration时间间隔的项目信息。

    当然无论是本地运行还是在服务器上运行,Java飞行记录器都支持创建一个模板。

    在高级模式中,你可以自定义自己想要的信息。

     创建好模板后,无论是在本地还是复制到远程服务器上,

    jcmd <PID> JFR.start name=test duration=60s settings=template.jfc filename=/tmp/output.jfr

    settings=template.jfc就可以指定使用templayte.jfc这个模板的配置去收集项目信息。

    3:GDB(参考文章:https://www.atlassian.com/blog/archives/so-you-want-your-jvms-heap

    首先机器上需要安装gdb,gdb的安装就不赘述了,

    sudo apt-get install gdb

    sudo yum install gdb

    brew install gdb

    1:使用gdb生成java heap文件

    1.1:生成进程core文件

    sudo gdb -p <PID>

    . . .bunch of info. . .

    (gdb)gocre /tmp/jvm.core

      Saved corefile /tmp/jvm.core

    (gdb) detach

    (gdb) quit

    1.2:根据core文件生成java heap文件

    sudo jmap -dump:format=b,file=/tmp/jvm.hprof /usr/bin/java (自己机器java路径) /tmp/jvm.core

    2:运行MAT找出内存泄漏根源(MAT下载:https://www.eclipse.org/mat/downloads.php

     

     点击finish,然后就可以看到当前java进程的堆栈信息。

     4:常用的查看java进程堆栈信息命令

    JVM学习----查看堆栈信息这篇文章较全面的写了jstat、jmap的详细用法,下面我列举自己常用的一些命令:

    每3秒钟输出一次当前进程已使用空间占总空间的百分比

    命令:jstat -gcutil <PID>  3000   

    打印进程堆存活的各个对象个数和所占大小

    命令:jmap -histo:live <PID> | more

    使用jcmd不加任何参数即可获取jvm进程列表

    命令:jcmd

    使用jcmd help能够获取某个jvm进程其他可用的诊断命令

    命令:jcmd <PID> help

    它所列举的commands都是可以使用的。

    5:参考文章相关链接:

    Java Performance Tuning Guide:http://java-performance.info/

    JVM学习----查看堆栈信息:https://blog.csdn.net/eos2009/article/details/78522901

    JVM’s heap:https://www.atlassian.com/blog/archives/so-you-want-your-jvms-heap

  • 相关阅读:
    2020牛客暑期多校训练营(第五场)D 思维|最长上升子序列
    codeforces-1343E(贪心+BFS)
    2020牛客暑期多校训练营(第三场)C 计算几何
    codeforces-1385E(拓扑排序)
    2020牛客寒假算法基础训练营2
    2020牛客寒假算法基础训练营1
    codeforces-1295D(欧拉函数)
    codeforces-1283D(多源BFS)
    深入理解JVM之JVM内存区域与内存分配
    属性动画详解一(Property Animation)
  • 原文地址:https://www.cnblogs.com/yxy-ngu/p/10350103.html
Copyright © 2011-2022 走看看