好记性不如烂笔头,戊戌年的最后一个工做日,把本身平时在开发过程当中使用的一些java性能优化工具作一个简单的小结,php
主要包括 jvisualvm、jfr、gdb和查看内存对象信息的几个linux命令。java
注:当前系统属性 Mac OS X 10.13.6,jdk版本 1.8.0_151linux
能够看到jvisualvm不只支持本地应用程序的追踪还支持远程。性能优化
而后打开对应的本地项目:服务器
这里面确实有不少项目的信息,CPU、堆栈信息等。网络
我目前使用它就是用它的抽样器,查看当前项目里的对象数及对象占用的内存大小。eclipse
这样对项目中某个对象个数过多或者对象过大,就能够方便的查看到,而后去优化它。jvm
jfr的优势:ide
VisualVM功能强大,支持图形化界面操做,能够很快定位代码问题。可是它对应用性能的影响也很是大,因此不适合在生产环境下使用。工具
还有这些软件(好比GDB(下面介绍))要attach到jvm进程上,生产环境通常网络隔离,很难作到。
使用jfr不须要在现有应用上额外添加任何参数、重启进程等,直接在命令行执行便可,实时生效,100%无入侵,且稳定可靠,不影响线上应用运行。
jfr的使用:
1:须要在项目jvm加上配置 vm options:-XX:+UnlockCommercialFeatures -XX:+FlightRecorder
2:打开jmc
3:打开对应的进程ID,就能够追踪本项目的堆栈、CPU等信息
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这个模板的配置去收集项目信息。
首先机器上须要安装gdb,gdb的安装就不赘述了,
sudo apt-get install gdb
sudo yum install gdb
brew install gdb
sudo gdb -p <PID>
. . .bunch of info. . .
(gdb)gocre /tmp/jvm.core
Saved corefile /tmp/jvm.core
(gdb) detach
(gdb) quit
sudo jmap -dump:format=b,file=/tmp/jvm.hprof /usr/bin/java (本身机器java路径) /tmp/jvm.core
点击finish,而后就能够看到当前java进程的堆栈信息。
JVM学习----查看堆栈信息这篇文章较全面的写了jstat、jmap的详细用法,下面我列举本身经常使用的一些命令:
每3秒钟输出一次当前进程已使用空间占总空间的百分比
命令:jstat -gcutil <PID> 3000
打印进程堆存活的各个对象个数和所占大小
命令:jmap -histo:live <PID> | more
使用jcmd不加任何参数便可获取jvm进程列表
命令:jcmd
使用jcmd help可以获取某个jvm进程其余可用的诊断命令
命令:jcmd <PID> help
它所列举的commands都是可使用的。
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