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
JAVA性能优化工具小记的更多相关文章
- 9个Java性能优化工具汇总
本文来自blog.idrsolutions.com 1.NetBeans profiler NetBeans Profiler是一个模块化的添加,为NetBeans IDE提供分析功能,它是一个开源的 ...
- JVM——九大工具助你玩转Java性能优化
本文转载自 http://www.importnew.com/12324.html 本文由 ImportNew - 陈 晓舜 翻译自 idrsolutions.欢迎加入翻译小组.转载请参见文章末尾的要 ...
- 九大工具助你玩转Java性能优化
在这篇文章中,我会带着大家一起看一下9个可以帮助我们优化Java性能的工具.有一些我们已经在IDR Solutions中使用了,而另外一些有可能在个人项目中使用. NetBeans Profiler ...
- Java性能优化的9大工具
在这篇文章中,我会带着大家一起看一下9个可以帮助我们优化Java性能的工具.有一些我们已经在IDR Solutions中使用了,而另外一些有可能在个人项目中使用. NetBeans Profiler ...
- Java 性能分析工具 , 第 2 部分:Java 内置监控工具
引言 本文为 Java 性能分析工具系列文章第二篇,第一篇:操作系统工具.在本文中将介绍如何使用 Java 内置监控工具更加深入的了解 Java 应用程序和 JVM 本身.在 JDK 中有许多内置的工 ...
- 《Java性能优化权威指南》
<Java性能优化权威指南> 基本信息 原书名:Java performance 原出版社: Addison-Wesley Professional 作者: (美)Charlie Hunt ...
- 推荐:Java性能优化系列集锦
Java性能问题一直困扰着广大程序员,由于平台复杂性,要定位问题,找出其根源确实很难.随着10多年Java平台的改进以及新出现的多核多处理器,Java软件的性能和扩展性已经今非昔比了.现代JVM持续演 ...
- Java 性能优化的五大技巧
要对你的 Java 代码进行优化,需要理解 Java 不同要素之间的相互作用,以及它是如何与其运行时的操作系统进行交互的.使用下面这五个技巧和资源,开始学习如何分析和优化你的代码吧. 在我们开始之前, ...
- 【转】10种简单的Java性能优化
10种简单的Java性能优化 2015/06/23 | 分类: 基础技术 | 14 条评论 | 标签: 性能优化 分享到: 本文由 ImportNew - 一直在路上 翻译自 jaxenter.欢迎加 ...
随机推荐
- HTML前端入门归纳——样式
本人一直在从事.net的开发,界面都是采用的WPF,近期花了一个多月进行HTML前端的学习,在这里呢进行学习总结和归纳. 本系列将主要分为4个模块: 控件 样式 布局 JavaScript 根据多年W ...
- L3-010 是否完全二叉搜索树 (30分)
题解 判断一棵树是否是完全二叉树: 取队列的头,将头的左右孩子入队,循环每次判断是否为空,如果为空节点,此时退出循环. 然后检查队列中的元素是否全部为空,如果是则说明是完全二叉树,否则不是. 代码 # ...
- SQL过滤条件on和where
在使用left jion时,会生成一张中间的临时表,然后再将这张临时表返回给用户. on和where条件的区别如下:1. on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表 ...
- [LEETCODE] 初级算法/数组 1.1删除排序数组中的重复项
题目: 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成. ...
- Go_栈
1. 栈的介绍 2. 栈的应用 3. 栈入门 package main import ( "fmt" "errors" ) //使用数组来模拟一个栈的使用 ty ...
- 使用Docker搭建Spark集群(用于实现网站流量实时分析模块)
上一篇使用Docker搭建了Hadoop的完全分布式:使用Docker搭建Hadoop集群(伪分布式与完全分布式),本次记录搭建spark集群,使用两者同时来实现之前一直未完成的项目:网站日志流量分析 ...
- html 打印相关操作与实现
2020-02-19 | chrome 79.0.3945.130 测试无问题 未做兼容测试 原理为调用 window.print() 方法,但是该方法只能对当前页面全部打印,所以有了以下方案来解决局 ...
- 刷题11. Container With Most Water
一.题目说明 11.Container With Most Water,这个题目难度是Medium. 二.我的做法 乍一看,简单啊,两个for循环就可以了,我在本地写的. #include<io ...
- linux下使用crontab新建定时任务
我安装了一个全文搜索的插件,但是需要生成索引才能使用,但是不能手动生成索引,所以说呢,我就加了一个定时任务, 一.首先vim /etc/crontab 打开文件 我根据上面的提示加了用户名,但是看到其 ...
- tkinter学习(4)frame、pack、canvas学习
1.frame和pack学习 1.1 代码: import tkinter as tk window = tk.Tk() window.title('my window') window.geomet ...