java性能调优寻找瓶颈常用的命令_Java性能调优:利用VisualVM进行性能分析-程序员宅基地

技术标签: java性能调优寻找瓶颈常用的命令  

JVisualVM 简介

VisualVM 是Netbeans的profile子项目,已在JDK6.0 update 7 中自带,能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来的)。在JDK_HOME/bin(默认是C:\Program Files\Java\jdk1.6.0_13\bin)目录下面,有一个jvisualvm.exe文件,双击打开,从UI上来看,这个软件是基于NetBeans开发的了。

VisualVM 提供了一个可视界面,用于查看 Java 虚拟机 (Java Virtual Machine, JVM) 上运行的基于 Java 技术的应用程序的详细信息。VisualVM 对 Java Development Kit (JDK) 工具所检索的 JVM 软件相关数据进行组织,并通过一种使您可以快速查看有关多个 Java 应用程序的数据的方式提供该信息。您可以查看本地应用程序或远程主机上运行的应用程序的相关数据。此外,还可以捕获有关 JVM 软件实例的数据,并将该数据保存到本地系统,以供后期查看或与其他用户共享。

双击启动 jvisualvm.exe,启动起来后和jconsole 一样同样可以选择本地和远程,如果需要监控远程同样需要配置相关参数。

主界面如下;

L3Byb3h5L2h0dHAvd3d3Lml0eW91a25vdy5jb20vYXNzZXRzL2ltYWdlcy8yMDE3L2p2bS9qdmlzdWFsdm0wMS5qcGc=.jpg

VisualVM可以根据需要安装不同的插件,每个插件的关注点都不同,有的主要监控GC,有的主要监控内存,有的监控线程等。

L3Byb3h5L2h0dHAvd3d3Lml0eW91a25vdy5jb20vYXNzZXRzL2ltYWdlcy8yMDE3L2p2bS9qdmlzdWFsdm0wMi5qcGc=.jpg

如何安装:

1、从主菜单中选择“工具”>“插件”。

2、在“可用插件”标签中,选中该插件的“安装”复选框。单击“安装”。

3、逐步完成插件安装程序。

我这里以 Eclipse(pid 22296)为例,双击后直接展开,主界面展示了系统和jvm两大块内容,点击右下方jvm参数和系统属性可以参考详细的参数信息.

L3Byb3h5L2h0dHAvd3d3Lml0eW91a25vdy5jb20vYXNzZXRzL2ltYWdlcy8yMDE3L2p2bS9qdmlzdWFsdm0wMy5qcGc=.jpg

因为VisualVM的插件太多,我这里主要介绍三个我主要使用几个:监控、线程、Visual GC

监控的主页其实也就是,cpu、内存、类、线程的图表

L3Byb3h5L2h0dHAvd3d3Lml0eW91a25vdy5jb20vYXNzZXRzL2ltYWdlcy8yMDE3L2p2bS9qdmlzdWFsdm0wNC5qcGc=.jpg

线程和jconsole功能没有太大的区别

L3Byb3h5L2h0dHAvd3d3Lml0eW91a25vdy5jb20vYXNzZXRzL2ltYWdlcy8yMDE3L2p2bS9qdmlzdWFsdm0wNS5qcGc=.jpg

Visual GC 是常常使用的一个功能,可以明显的看到年轻代、老年代的内存变化,以及gc频率、gc的时间等。

L3Byb3h5L2h0dHAvd3d3Lml0eW91a25vdy5jb20vYXNzZXRzL2ltYWdlcy8yMDE3L2p2bS9qdmlzdWFsdm0wNi5qcGc=.jpg

以上的功能其实jconsole几乎也有,VisualVM更全面更直观一些,另外VisualVM非常多的其它功能,可以分析dump的内存快照,

dump出来的线程快照并且进行分析等,还有其它很多的插件大家可以去探索

L3Byb3h5L2h0dHAvd3d3Lml0eW91a25vdy5jb20vYXNzZXRzL2ltYWdlcy8yMDE3L2p2bS9qdmlzdWFsdm0wNy5qcGc=.jpg

案例分析

准备模拟内存泄漏样例

1、定义静态变量HashMap

2、分段循环创建对象,并加入HashMap

代码如下:

import java.util.HashMap;

import java.util.Map;

public class CyclicDependencies {

//声明缓存对象

private static final Map map = new HashMap();

public static void main(String args[]){

try {

Thread.sleep(10000);//给打开visualvm时间

} catch (InterruptedException e) {

e.printStackTrace();

}

//循环添加对象到缓存

for(int i=0; i<1000000;i++){

TestMemory t = new TestMemory();

map.put("key"+i,t);

}

System.out.println("first");

//为dump出堆提供时间

try {

Thread.sleep(10000);

} catch (InterruptedException e) {

e.printStackTrace();

}

for(int i=0; i<1000000;i++){

TestMemory t = new TestMemory();

map.put("key"+i,t);

}

System.out.println("second");

try {

Thread.sleep(10000);

} catch (InterruptedException e) {

e.printStackTrace();

}

for(int i=0; i<3000000;i++){

TestMemory t = new TestMemory();

map.put("key"+i,t);

}

System.out.println("third");

try {

Thread.sleep(10000);

} catch (InterruptedException e) {

e.printStackTrace();

}

for(int i=0; i<4000000;i++){

TestMemory t = new TestMemory();

map.put("key"+i,t);

}

System.out.println("forth");

try {

Thread.sleep(Integer.MAX_VALUE);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("qqqq");

}

}

3、配置jvm参数如下:

-Xms512m

-Xmx512m

-XX:-UseGCOverheadLimit

-XX:MaxPermSize=50m

4、运行程序并打卡visualvm监控

使用JVisualVM分析内存泄漏

1、查看Visual GC标签,内容如下,这是输出first的截图

935c87de71b520777df04e40e72ea4ac.png

这是输出forth的截图:

b1430c07c07618c2095fcf63a67f936d.png

通过2张图对比发现:

98698d2766bdfc9c7c5427f63f632c2f.png

8668bb0f59e0b4d666000ced8f4f9645.png

老生代一直在gc,当程序继续运行可以发现老生代gc还在继续:

ad758e0d4be119aaac08ac08790a89f5.png

增加到了7次,但是老生代的内存并没有减少。说明存在无法被回收的对象,可能是内存泄漏了。

如何分析是那个对象泄漏了呢?打开抽样器标签:点击后如下图:

8ad8bca7981a346a9374b8d2e25a3b3e.png

按照程序输出进行堆dump,当输出second时,dump一次,当输出forth时dump一次。

进入最后dump出来的堆标签,点击类:

3b5be772be4984d0f9fc0bab97f66646.png

点击右上角:“与另一个堆存储对比”。如图选择第一次导出的dump内容比较:

9af47a6f88d7ed77107423fa57a85e55.png

比较结果如下:

75d535560b68ec8823f907a38261e54b.png

可以看出在两次间隔时间内TestMemory对象实例一直在增加并且多了,说明该对象引用的方法可能存在内存泄漏。

如何查看对象引用关系呢?

右键选择类TestMemory,选择“在实例视图中显示”,如下所示:

49fd44599eb8ff5f1c5da05f3c6d39df.png

左侧是创建的实例总数,右侧上部为该实例的结构,下面为引用说明,从图中可以看出在类CyclicDependencies里面被引用了,并且被HashMap引用。

如此可以确定泄漏的位置,进而根据实际情况进行分析解决。

JVisualVM 远程监控 Tomcat

1、修改远程tomcat的catalina.sh配置文件,在其中增加:

JAVA_OPTS="$JAVA_OPTS

-Djava.rmi.server.hostname=192.168.122.128

-Dcom.sun.management.jmxremote.port=18999

-Dcom.sun.management.jmxremote.ssl=false

-Dcom.sun.management.jmxremote.authenticate=false"

这次配置先不走权限校验。只是打开jmx端口。

2、打开jvisualvm,右键远程,选择添加远程主机:

83be000b0dfa9b47b1dd12be63246911.png

3、输入主机的名称,直接写ip,如下:

bbc1f9b0356454bb16b73e5fb55242b0.png

右键新建的主机,选择添加JMX连接,输入在tomcat中配置的端口即可。

4、双击打开。完毕!

参考资料

https://blog.csdn.net/kl28978113/article/details/53817827

https://www.cnblogs.com/ityouknow/p/6437037.html

Java性能调优:利用JMC分析性能

Java性能调优作为大型分布式系统提供高性能服务的必修课,其重要性不言而喻. 好的分析工具能起到事半功倍的效果,利用分析利器JMC.JFR,可以实现性能问题的准确定位. 本文主要阐述如何利用JMC分析 ...

Java性能调优:利用JFR生成性能日志

Java性能调优作为大型分布式系统提供高性能服务的必修课,其重要性不言而喻. 好的分析工具能起到事半功倍的效果,利用分析利器JMC.JFR,可以实现性能问题的准确定位. 本文主要阐述如何利用JFR生成 ...

Java性能调优&lpar;一&rpar;&colon;调优的流程和程序性能分析

https://blog.csdn.net/Oeljeklaus/article/details/80656732 Java性能调优 随着应用的数据量不断的增加,系统的反应一般会越来越慢,这个时候我 ...

Java性能调优笔记

Java性能调优笔记 调优步骤:衡量系统现状.设定调优目标.寻找性能瓶颈.性能调优.衡量是否到达目标(如果未到达目标,需重新寻找性能瓶颈).性能调优结束. 寻找性能瓶颈 性能瓶颈的表象:资源消耗过多. ...

第六章 Java性能调优工具(待续)

Java性能调优工具 Windows工具 JDK命令行工具 JConsole工具 Visual VM多合一工具 Visual VM对QQL的支持 MAT内存分析工具 MAT对QQL的支持 JProfi ...

java 性能调优和GC

JAVA 性能调优和GC http://blog.csdn.net/gzh0222/article/details/7663181 JAVA GC调优手记 http://blog.csdn.net/f ...

Java性能调优概述

目录 Java性能调优概述 性能优化有风险和弊端,性能调优必须有明确的目标,不要为了调优而调优!!!盲目调优,风险远大于收益!!! 程序性能的主要表现点 执行速度:程序的反映是否迅速,响应时间是否足够 ...

Java性能调优攻略全分享,5步搞定!(附超全技能图谱)

对于很多研发人员来说,Java 性能调优都是很头疼的问题,为什么这么说?如今,一个简单的系统就囊括了应用程序.数据库.容器.操作系统.网络等技术,线上一旦出现性能问题,就可能要你协调多方面组件去进行优 ...

Java性能调优

一.JVM内存模型及垃圾收集算法 1.根据Java虚拟机规范,JVM将内存划分为: New(年轻代) Tenured(年老代) 永久代(Perm) 其中New和Tenured属于堆内存,堆内存会从JV ...

成为Java GC专家(5)—Java性能调优原则

并不是每个程序都需要调优.如果一个程序性能表现和预期一样,你不必付出额外的精力去提高它的性能.然而,在程序调试完成之后,很难马上就满足它的性能需求,于是就有了调优这项工作.无论哪种编程语言,对应用程序 ...

随机推荐

NSDate

NSDate : NSDate *date = [NSDate date];获取当前日期 NSDate 可以进行比较,通过earlierDate:方法获取二个日期中最早的. NSDate 通过late ...

转:linux下Xampp安装与配置

--转载时请保留下面,以供大家加我MSN,增强交流,共同学习.--姜庭华  msn: [email protected]博客:http://blog.csdn.net/jaimejth 软件下载在以 ...

【集训笔记】博弈论相关知识【HDOJ 1850【HDOJ2147

以下资料来自:http://blog.csdn.net/Dinosoft/article/details/6795700 http://qianmacao.blog.163.com/blog/stat ...

软件工程&lpar;GZSD2015&rpar; 第三次作业

时间: 2015/4/17-2015/4/23 基本要求: 在之前编写的四则运算程序基础之上做如下改进: 请参照教材Page57:4.2-4.3节中内容,修改原程序,使之符合 "代码风格和设 ...

WebRTC学习之 Intel&&num;174&semi; Collaboration Suite for WebRTC源码流程解读

年后回来,因为新项目的需求,开始了解WebRTC相关的知识.目前接触的是Intel Collaboration Suite for WebRTC.刚开始看SDK发现很多概念是我目前不知道的,于是恶补 ...

CentOS7下cratedb备份及恢复(快照)

一:创建存储库 1.1 概要 CREATE REPOSITORY repository_name TYPE type [ WITH (repository_parameter [= value], [ ...

云计算-MapReduce

Hadoop示例程序WordCount详解及实例http://blog.csdn.net/xw13106209/article/details/6116323 hadoop中使用MapReduce编程 ...

JDBC创建表实例

在本教程将演示如何在JDBC应用程序中创建一个数据库表. 在执行以下示例之前,请确保您已经准备好以下操作: 具有数据库管理员权限,以在给定模式中创建数据库表. 要执行以下示例,需要用实际用户名和密码替 ...

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30768103/article/details/114849787

智能推荐

odoo中接口开发-程序员宅基地

文章浏览阅读1.4k次。文章参考:https://blog.csdn.net/qq_33472765/article/details/81913627案例0000001接口调用请求说明:https请求方式:GET(请使用https协议)csrf=Falsecsrf(Cross-site request forgery跨站请求伪造)问题,get请求不影响,post就需要csrf认证CSRF(跨站请求伪造) ..._odoo 开发restful服务接口

用limma包的voom方法来做RNA-seq 差异分析_limma voom-程序员宅基地

文章浏览阅读3k次,点赞3次,收藏17次。用limma包的voom方法来做RNA-seq 差异分析大家都知道,这十几年来最流行的差异分析软件就是R的limma包了,但是它以前只支持microarray的表达数据。考虑到大家都熟悉了它,它又发了一个voom的方法,让它从此支持RNA-seq的count数据啦!大家都知道芯片数据跟RNA-seq数据的本质就是value的分布不一样,所以各种针对RNA-seq的差异分析包也就是提出来一个新的normalization方法而已。而我们limma本身就提出了一个voom的方法来对RNA-seq数据进行_limma voom

应聘华为的朋友小心了,应聘华为的悲惨遭遇!-程序员宅基地

文章浏览阅读9.5k次,点赞3次,收藏2次。 以下内容全部真实,为本人亲身经历。可随时进行当面对质。   本人女朋友,原本是西安一家企业里面的行政助理,工作比较稳定,收入不高,但也基本够她用了。    一天,我的一个同学(华为员工)说华为西研所正在招聘文员,让我女朋友去试一下。由于我的几个同学都是华为的,我对华为的印象也还不错,再加上华为应该可以给我女朋友更高一些的工资,于是我便让我女朋友去面试了。    经过近一个月的漫

python 遗传算法优化bp神经网络_利用遗传算法优化BP神经网络出现了一些问题,求大神解答...-程序员宅基地

文章浏览阅读1.6k次。本帖最后由 初学者er 于 2019-3-1 20:25 编辑总是出现错误:错误使用 network/subsasgn>network_subsasgn (line 550)net.IW{1,1} must be a 6-by-0 matrix.出错 network/subsasgn (line 10)net = network_subsasgn(net,subscripts,v,netna..._错误使用 network/subsasgn>network_subsasgn net.lw{2,1} must be a 53-by-6 mat

python编程特性_Python--核心编程特性-程序员宅基地

文章浏览阅读45次。1.模块导入问题如何导入模块:import sys如何查看该模块路径:prinnt(sys.path)2.== 与 is 的比较 返回Ture Flase"=="用来比较两个值是否相等"is"用来表示两个变量是否是同一个,比较的是内存地址(针对引用类型(list,tuper,dict)1 a=[1,2,3]2 b=[1,2,3]3 a==b4 aisb5 基本数据验证6 a=2567..._python编程2=a是对的吗

R语言:结构方程模型、潜变量分析-程序员宅基地

文章浏览阅读7.3k次,点赞5次,收藏43次。结构方程模型入门介绍对于熟悉线性回归拟合结构方程模型的分析师来说,首先会感到奇怪。在R环境中,拟合结构方程模型涉及学习新的建模语法,新的绘图语法以及通常是新的数据输入方法。然而,快速重新定位并且很快用户会接触到差异,拟合结构方程模型可以成为分析师工具箱中的强大工具。构造潜在变量比较替代模型对较大数据集的多组分析。设置 环境在R中开始使用结构方程建模(SEM)...

随便推点

关于SlidingMenu的一些改进写法,仿QQ5.0侧拉缩进_android slidemenu setbehindwidthres设置左右平分-程序员宅基地

文章浏览阅读973次。SlidingMenu的使用教程很多,如果只需要简单的侧拉,使用如下的办法简单加载点击SlidingMenu下载首先下载完毕导入项目中,导入方式如图 这时还没有玩,slidingMenu在文件夹下另一个包中,包名为library如图(点击确定)完成后开始记得看下app > build.gradle 是不是有这个项目的引用,么有就自己写,有就当这句话不存在。之后开始配置menu的初始信息privat_android slidemenu setbehindwidthres设置左右平分

Gandiva, using LLVM and Arrow to JIT and evaluate Pandas expressions-程序员宅基地

文章浏览阅读893次。从11年前开始,我就一直是LLVM的忠实拥护者,那时我开始使用LLVM处理JIT数据结构(例如AVL),然后使用JIT限制的AST树和TensorFlow图中的JIT本机代码。从那时起,LLVM演变为最重要的编译器框架生态系统之一,如今已被许多重要的开源项目使用。我最近意识到的一个很酷的项目是Gandiva。Gandiva由Dremio开发,然后捐赠给Apache Arrow(为此向Dremio团队表示敬意)。Gandiva的主要思想是提供一个编译器来生成LLVM IR,该LLVM IR可以在批处理的A_gandiva

React Native 修改Android工程目录-程序员宅基地

文章浏览阅读372次。标准的React-Native Android项目,用Android Studio或者IntelliJ Idea打开,需要打开React-Native下的android目录,而作为一名android开发者,当然希望是打开Reac..._react native修改android默认目录

flask-socketio 实现-程序员宅基地

文章浏览阅读167次。Flask-SocketIO使Flask应用程序可以访问客户端和服务器之间的低延迟双向通信。 客户端应用程序可以使用Javascript,C ++,Java和Swift中的任何SocketIO官方客户端库,或任何兼容的客户端来建立与服务器的永久连接。1,安装pip install flask-socketio2,依赖Flask-SocketIO兼容Python 2.7和Pyth..._flask-socketio current_user

Spark-shuffle源码细读一:ShuffleManager_sparksql shuffledrowrdd-程序员宅基地

文章浏览阅读1.4k次。version:spark 3.0.1ShuffleManager目前只有一个实现SortShuffleManager。分析其源码。_sparksql shuffledrowrdd

为何excel中数据无法计算机,造成Excel表格打不开的几种原因及解决办法-程序员宅基地

文章浏览阅读2.6k次。无法打开Excel表的原因是什么?如果无法打开Excel表怎么办?以下是导致Excel表无法打开的一些原因和解决方案。一、无法打开Excel表格的原因1、计算机中毒如果计算机中毒,则可能无法打开Excel电子表格文件。当然,如果计算机中毒了,则不仅可能无法打开Excel电子表格文件,而且也可能无法打开其他文件,并且还可能会影响不同类型病毒的影响。区别例如:如果是宏病毒,则应用宏后可能无法打开文件。..._数据模型问题导致无法打开工作簿

推荐文章

热门文章

相关标签