java = 优化_JAVA性能优化工具小记

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

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

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

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

4e14560d1bd78ec4601c9795ce8ae471.png

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

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

58fc74884c5e06163269b6d3ec896298.png

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

d79eb12f77783001b75fc0e9a46c9b96.png

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

567bc73d9a047da8a8a3d0a825b9e4ff.png

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

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等信息

6f66a95bb9f28c0212e75aeefa2a008e.png

2.2:在服务器上使用:

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

jcmd VM.unlock_commercial_features

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

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

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

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

8fae2f3bc52554aaea88fd183a0d64c6.png

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

afa10afb8d04f831e922707ac2153c8b.png

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

jcmd 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

1:使用gdb生成java heap文件

1.1:生成进程core文件

sudo gdb -p

. . .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

586942859ac5ad450452a37ae44f7544.png

603e0ca60b4e5d3e78b4522b39ddd11c.png

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

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

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

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

命令:jstat -gcutil   3000

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

命令:jmap -histo:live | more

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

命令:jcmd

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

命令:jcmd 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值