java visualvm远程监控_深入理解JVM虚拟机12:JVM性能管理神器VisualVM介绍与实战

本文转自互联网,侵删
本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看
https://github.com/h2pl/Java-Tutorial
喜欢的话麻烦点下Star哈
文章将同步到我的个人博客:
http://www.how2playlife.com
本文是微信公众号【Java技术江湖】的《深入理解JVM虚拟机》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。
该系列博文会告诉你如何从入门到进阶,一步步地学习JVM基础知识,并上手进行JVM调优实战,JVM是每一个Java工程师必须要学习和理解的知识点,你必须要掌握其实现原理,才能更完整地了解整个Java技术体系,形成自己的知识框架。
为了更好地总结和检验你的学习成果,本系列文章也会提供每个知识点对应的面试题以及参考答案。
如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。
一、VisualVM是什么?
VisualVM是一款免费的JAVA虚拟机图形化监控分析工具。
1. 拥有图形化的监控界面。2. 提供本地、远程的JVM监控分析功能。3. 是一款免费的JAVA工具。4. VisualVM拥有丰富的插件支持。
## 二、如何获取VisualVM?VisualVM官方网站:http://visualvm.java.net/
VisualVM各版本下载页面: http://visualvm.java.net/releases.html
下载VisualVM时也应该注意,不同的JDK版本对应不同版本的VisualVM,具体根据安装的JDK版本来下载第一的VisualVM。
三、获取那个版本?
下载版本参考:Java虚拟机性能管理神器 - VisualVM(4) - JDK版本与VisualVM版本对应关系
备注:下列表中显示1.3.6版本只适合JDK7和JDK8,可是我用1.3.6版还是可以监控JDK1.6_45的版本。
四、VisualVM能做什么?
- 显示JAVA应用程序配置和运行时环境。
显示JAVA应用程序JVM参数,系统属性,JVM的信息和运行环境。
- 显示本地和远程JAVA应用程序运行状态。
可以连接到远程服务器上运行的JAVA应用程序,监控应用程序的运行状态。
- 监控应用程序的性能消耗。
可以监控到应用程序热点方法的执行单次时间、总耗时、耗时占比。
- 显示应用程序内存分配,显示分析堆信息。
显示应用程序在运行时的编译时间、加载时间、垃圾回收时间、内存区域的回收状态等。
- 监控应用程序线程状态和生命周期。
监控应用程序线程的运行、休眠、等待、锁定状态。
- 显示、分析线程堆信息。
显示线程当前运行状态和关联类信息。
- 支持第三方插件来分析JAVA应用程序。
另外还提供更多更强大、方便的第三方插件。
监控远程主机上的JAVA应用程序
使用VisualVM监控远程主机上JAVA应用程序时,需要开启远程主机上的远程监控访问,或者在远程JAVA应用程序启动时,开启远程监控选项,两种方法,选择其中一种就可以开启远程监控功能,配置完成后就可以在本地对远程主机上的JAVA应用程序进行监控。
1.远程服务器、应用程序配置1.1配合jstatd工具提供监控数据
1.1.1创建安全访问文件在JAVA_HOME/bin目录中,创建名称为jstatdAllPolicy文件(这个文件名称也可以顺便起,不过要与jstatd启动时指定名称相同),将以下内容拷贝到文件中。并保证文件的权限和用户都正确。
grant codebase"file:${java.home}/../lib/tools.jar"{ permission java.security.AllPermission; };
1.1.2启动jstatd服务在JAVA_HOME/bin目录中,执行以下命令:
./jstatd -J-Djava.security.policy=jstatdAllPolicy-p 1099 -J-Djava.rmi.server.hostname=192.168.xxx.xxx
jstatd命令描述以及参数说明:
jstatd是一个基于RMI(Remove Method Invocation)的服务程序,它用于监控基于HotSpot的JVM中资源的创建及销毁,并且提供了一个远程接口允许远程的监控工具连接到本地的JVM执行命令。
-J-Djava.security.policy=jstatdAllPolicy 指定安全策略文件名称
-p 1099 指定启动端口
-J-Djava.rmi.server.hostname=192.168.xxx.xxx 指定本机IP地址,在hosts文件配置不正常时使用,最好加上。
1.2JVM启动时配置远程监控选项在需要远程监控的JVM启动时,开启远程监控选项
-Dcom.sun.management.jmxremote.port=1099-Dcom.sun.management.jmxremote.ssl=false-Dcom.sun.management.jmxremote.authenticate=false-Djava.rmi.server.hostname=192.168.xxx.xxx
2.本地VisualVM配置在本地VisualVM的应用程序窗口,右键单击【远程】》【添加远程主机】》【主机名】中输入远程主机的IP地址,点击【高级设置】输入远程主机开启的监控端口,点击【确定】完成配置。
如果一切正常,就可以看到远程主机上的JAVA应用程序了。
排查JAVA应用程序内存泄漏
- 发现问题
线上应用部署完成后,运行1~2天左右就会出现假死,或者某天早上8~10点高峰期间突然不处理数据了。由于在测试环境的压力测试没有做完全,也没有遇到相关问题。情况出现后对客户的使用造成很大影响,领导要求赶紧排查出问题原因!
- 排查原因
排查原因前,与运维沟通,了解线上服务器的运行状态,通过ganglila观察网络、CPU、内存、磁盘的运行历史状态,发现程序故障前,都有一波很高的负载,排查线上日志,负载来源在8~9点平台接入数据量成倍增加,通过与产品和市场人员分析,此时段是用户集中上班、接入平台的高峰时段,访问日志也显示,业务场景正常,无网络攻击和安全问题。属于产品业务正常的场景。
排除了网络安全因素后,就从程序的运行内部进行排查,首先想到的获取JVM的dmp文件。获取JVM的dmp文件有两中方式:
1. JVM启动时增加两个参数,出现 OOME 时生成堆 dump:
-XX:+HeapDumpOnOutOfMemoryError
生成堆文件地址:
-XX:HeapDumpPath=/home/test/jvmlogs/
2. 发现程序异常前通过执行指令,直接生成当前JVM的dmp文件,15434是指JVM的进程号
jmap -dump:format=b,file=serviceDump.dat 15434
由于第一种方式是一种事后方式,需要等待当前JVM出现问题后才能生成dmp文件,实时性不高,第二种方式在执行时,JVM是暂停服务的,所以对线上的运行会产生影响。所以建议第一种方式。
- 解决方案
获取到dmp文件后,就开始进行分析。将服务器上的dmp文件拷贝到本地,然后启动本地的VisualVM,点击菜单栏【文件】选项,装入dmp文件
打开dmp文件后,查看类标签,就能看到占用内存的一个排行。
然后通过检查中查找最大的对象,排查到具体线程和对象。
上列中的com.ctfo.trackservice.handler.TrackHandleThread#4就是重点排查对象。
通过代码的比对,在此线程中,有调用DAO接口,负责将数据存储到数据库中。而存储到数据库中时,由于存储速度较慢,导致此线程中的数据队列满了,数据积压,无法回收导致了队列锁定,结果就是程序假死,不处理数据。
通过进一步分析,发现数据库存储时有瓶颈,虽然当前是批量提交,速度也不快。平均8000/秒的存储速度。而数据库有一个DG(备份)节点,采用的是同步备份方式,即主库事务要等DG的事务也完成后才能返回成功,这样就会因为网络因素、DG性能因素等原因导致性能下降。通过与DBA、产品、沟通,将同步备份改为异步备份,实时同步改为异步(异步可能会导致主备有10分钟以内的数据延迟)。速度达到30000/秒。问题解决。
至此,通过VisualVM分析java程序内存泄漏到此结束。不过还有几个问题:1. 如果dmp文件较大,VisualVM分析时间可能很久;另外,VisualVM对堆的分析显示功能还不算全面。如果需要更全面的显示,就可以使用另外一个专业的dmp文件分析工具【Memory Analyzer (MAT)】,此工具可以作为eclipse的插件进行安装,也可以单独下载使用。如果有感兴趣的朋友,我个人建议还是单独下载使用。下载地址:http://www.eclipse.org/mat/
查找JAVA应用程序耗时的方法函数
1.为什么要监控?JAVA程序在开发前,根据设计文档的性能需求,是要对程序的性能指标进行测试的。比如接口每秒响应次数要求1000次/秒,就需要平均每次请求处理的时间在1ms以内,如果需要满足这个指标,就需要在开发阶段对接口执行函数进行监控,也可以通过打印日志进行监控,从而统计对应的性能指标,然后可以根据性能指标的要求进行相应优化。
- 那些方法函数需要监控?
根据具体业务的场景和需求,主要集中在IO通讯、文件读写、数据库操作、业务逻辑处理上,这些都是制约性能的重要因素,所以需要重点关注。
- 如何排查
在研发环境,大部分会使用syso的方式或者日志方式打印性能损耗,如果代码没有加在运行时才想起来,或者想关注突然想起的函数,换做以前,是需要重启服务的,如果有VisualVM就可以直接查看耗时以及调用次数等情况。而不用打印、输出日志来查看性能损耗。
- 如何处理
对于性能损耗的函数,根据业务逻辑可以进行相应的优化,例如字符串处理、文件读写方式、SQL语句优化、多线程处理等等方式。
由于性能优化涉及的内容很多,这里就不深入了。主要是告诉大家通过VisualVM来排查问题的具体位置。
排查JAVA应用程序线程锁
- JAVA应用程序线程锁原因
JAVA线程锁的例子和原因网上一大堆,我也不在这里深入说明,这里主要是否讲如何使用VisualVM进行排查。至于例子可以看这里:http://blog.csdn.net/fengzhe0411/article/details/6953370
这个例子比较极端,一般情况下,出现锁竞争激烈是比较常见的。
- 排查JAVA应用程序线程锁
启动 VisualVM,在应用程序窗口,选择对应的JAVA应用,在详情窗口》线程标签(勾选线程可视化),查看线程生命周期状态,主要留意线程生命周期中红色部分。
(1)绿色:代表运行状态。一般属于正常情况。如果是多线程环境,生产者消费者模式下,消费者一直处于运行状态,说明消费者处理性能低,跟不上生产者的节奏,需要优化对应的代码,如果不处理,就可能导致消费者队列阻塞的现象。对应线程的【RUNNABLE】状态。
(2)蓝色:代表线程休眠。线程中调用Thread.sleep()函数的线程状态时,就是蓝色。对应线程的【TIMED_WAITING】状态。
(3)黄色:代表线程等待。调用线程的wait()函数就会出现黄色状态。对应线程的【WAITING】状态。
(4)红色:代码线程锁定。对应线程的【BLOCKED】状态。
- 分析解决JAVA应用程序线程锁
发生线程锁的原因有很多,我所遇到比较多的情况是多线程同时访问同一资源,且此资源使用synchronized关键字,导致一个线程要等另外一个线程使用完资源后才能运行。例如再没有连接池的情况下,同时访问数据库接口。这种情况会导致性能的极具下降,解决的方案是增加连接池,或者修改访问方式。或者将资源粒度细化,类似ConCurrentHashMap中的处理方式,将资源分为多个更小粒度的资源,在更小粒度资源上来处理锁,就可以解决资源竞争激烈的问题。]
参考文章
https://blog.csdn.net/android_hl/article/details/53228348
相关文章:

WCF入门(一)——简单的示例
这篇随笔写了一段时间了,当时没有发布,今天整理文档的时候发现了,顺便给配了些图。主要是绍了一下WCF编程模型,并给了一个简单的示例。 概述 WCF框架是下一代.NET平台通信应用程序的核心。它包含了Web服务、Remoting、同步和异步…

Callgrind--函数调用分析工具以及可视化方法
生成分析文件 命令行运行: valgrind --toolcallgrind ./palmGateMachine 检测完毕之后会生成一个文件callgrind.out.26805, 后面的数字其实是这个待测进程的pid 可视化方法 可视化方法 可视化工具 kcachegrind 1、下载地址: https://launchpad.net/ubuntu/trust…

Java中BASE64 编码
2019独角兽企业重金招聘Python工程师标准>>> BASE64 编码是一种常用的字符编码,在很多地方都会用到。JDK 中提供了非常方便的 BASE64Encoder 和 BASE64Decoder,用它们可以非常方便的完成基于 BASE64 的编码和解码。下面是本人编的两个小的函数…

java script (二)
实现轮播图 获取元素 document.getElementById("id名称") 事件(onlond) onlond "changeImg()" 在<script>中function changeImg(){ document.getElementById("img").src "图片地址"} 定时操作&…

转 [JAVA] 使用 common-fileupload 实现文件上传
就在前段时间,还在苦于找到不到合适的上传组件,虽然很早就知道了 common-fileupload,但当时却因为没有找到如何获取表单参数的方法而使用 jspSmartUpload,历尽艰辛终于找到了它的 jar,可是使用后才发现此东西对中文参数…

Cachegrind--缓存命中检查工具及其可视化
Cachegrind–缓存命中检查工具及其可视化 和 Callgrind–函数调用分析工具以及可视化方法 一模一样 命令改为: valgrind --toolcachegrind ./palmGateMachine 生成的文件名: cachegrind.out.8025 用kcachegrind 打开 参考我的另一篇文章: https://editor.csdn.…

java 快排_八大排序-快速排序(搞定面试之手写快排)
概要快速排序由C. A. R. Hoare在1960年提出,是八大排序算法中最常用的经典排序算法之一。其广泛应用的主要原因是高效,核心算法思想是分而治之。快速排序经常会被作为面试题进行考察,通常的考察思路是快排思想、编码实践之手写快排以及进一步…

maven命令简介
为什么80%的码农都做不了架构师?>>> 创建普通应用项目: mvn archetype:create -DgroupIdcom.byread -DartifactIdblog 创建WEB项目: mvn archetype:create -DgroupIdcom.byread -DartifactIdblogweb -DarchetypeArtifactIdmav…

分治策略解决幂乘问题
float fast_pow ( float x, float y ) {if ( y 1 )return x;else if ( (int)y % 2 0 )return fast_pow(x,y/2)*fast_pow(x,y/2);elsereturn fast_pow(x,(y-1)/2)*fast_pow(x,(y-1)/2)*x; } 转载于:https://www.cnblogs.com/Nicholastwo/p/9368076.html

用java实现一个计算器程序_1.2第一个java程序——hello world
第一个java程序——hello world实现一个java程序,主要有三个步骤:1、编写源代码,2、编译源代码,3、运行。java的源代码必须先编译,然后才能由JVM解析执行。所以我们程序员第一步的工作就是要编写java的源代码文件&…

linux valgrind Memcheck--内存检查工具
linux valgrind Memcheck–内存检查工具 使用方法: 注意,这里要用debug版本,如果是release的运行文件,则用debug编译出来的可执行文件替换 输出到终端: valgrind --toolmemcheck --leak-checkfull ./test.out输出到文件: valgrind --toolm…

Cassandra 1.2 发布,NoSQL 数据库
NoSQL 数据库 Cassandra 发布 1.2 正式版,该版本包含 CQL3,这是在 2012年4月发布的 1.1 版本中引入的。CQL 是一个 Cassandra 的建模和查询语言,类似关系数据库中的 SQL。CQL3 支持多列主键和很多其他的改进。 Another Cassandra 1.2 主要的增…

CQRS实践(3): Command执行结果的返回
上篇随笔讨论了CQRS中Command的一种基本实现。 面对UI中的各种命令,Controller会创建相应的Command对象,然后将其交给CommandBus,由CommandBus统一派发到相应的CommandExecutor中去执行,我们的ICommandBus的接口声明如下: public …

iOS学习——核心动画之Layer基础
iOS学习——核心动画之Layer基础 1、CALayer是什么? CALayer我们又称它叫做层。在每个UIView内部都有一个layer这样一个属性,UIView之所以能够显示,就是因为它里面有这个layer才具有显示的功能。我们可以通过操作CALayer对象,可以…

linux valgrind memCheck ---内存检查工具的可视化方法valkyrie
linux valgrind memCheck —内存检查工具的可视化方法valkyrie linux valgrind Memcheck–内存检查工具 1、安装valgrind valgrind 安装 安装过程没这么复杂。 直接命令行: sudo apt-get install valgrind2、安装valkyrie valkyrie下载连接: https://launchpad.net/ubuntu/…

屏幕为什么要正负压供电_负压变换器的设计
目前在工业、汽车电子系统中有诸如温度、压力、位置、重量和流量等物理参数的精确测量,这些信号中的一些传感器和前置放大器需要正负电压源驱动或供电,以提供足够宽的动态范围和抗干扰性。这些电子系统通常使用3.3V、5V、12V或24V中的某一电压的直流电源…

DataCleaner 3.1.1 发布,数据质量分析管理
DataCleaner 3.1.1 扩展了日期和时间相关的分析;增加周、月、年的分布分析;数值分析和日期时间分析增加了描述统计的选项;新增用于生成 UUID 和时间戳的转换器等等。 DataCleaner 是一个数据质量分析,比较,验证和监督的…
IIS负载均衡-Application Request Route详解第三篇:使用ARR进行Http请求的负载均衡(上)...
IIS负载均衡-Application Request Route详解第三篇:使用ARR进行Http请求的负载均衡(上) 在前两篇文章中,我们已经讲述如何配置与安装ARR,从本篇文章开始,我们将重点的来讲述如何在使用ARR进行负载均衡。 本…

云主机启动提示Booting from Hard Disk GRUB
版本:Openstack ocata 系统:centos7.3 环境:VMware workstation12 解决方法: 或者 转载于:https://www.cnblogs.com/fcing/p/9374855.html

函数 tostring_Kotlin实战之Fuel的高阶函数
Fuel 是一个用 Kotlin 写的网络库,与 OkHttp 相比较,它的代码结构比较简单,但是它的巧妙之处在于充分利用了 Kotlin 的语言特性,所以代码看上去干净利落。OkHttp 使用了一个 interceptor chain 来实现拦截器的串联调用,…

linux valgrind 安装和使用
linux valgrind 安装和使用 安装过程没这么复杂。 直接命令行: sudo apt-get install valgrind Valgrind 是个开源的工具,功能很多。例如检查内存泄漏工具—memcheck。 Valgrind 安装: sudo apt-get install valgrind Valgrind 命令介绍ÿ…

UIPopoverController在ARC环境下用法注意
在ARC环境下如果便用以下代码: [cpp] view plaincopyprint?UIViewController *viewTwo; viewTwo [[ViewTwo alloc] initWithNibName:"ViewTwo" bundle:nil]; UIPopoverController *popover; popover [[UIPopoverController alloc] initWithConten…

CPLD的分频语言
分频器在FPGA/CPLD设计中是不可缺少的一部分,这就包括分频系数是奇数和偶数的(我们称为奇分频和偶分频),而对于偶分频来说还有不同的分频方法,下面将给出具体的方法: 1、占空比不为50%的偶分频 占空比&…

彻底解决web开发中遇到的路径问题(上)
注:本文部分引用了网络上的文章,以及动力节点老师的讲解内容,感谢老师,嘻嘻。 为了举例方便,我新建了pathTest项目: 关于tomcat的配置,eclipse访问项目的路径一般是localhost:8080/projectName,…

关于Page翻页效果--Page View Controller
Page View Controllers你使用一个page view controller用page by page的方式来展示内容。一个page view controller管理一个self-contained视图架构。这个架构的父视图由page View controller管理,并且子视图由你提供的view Controllers管理。一,解析Pag…

linux平台下QtCreator中集成Valgrind系列工具
linux平台下QtCreator中集成Valgrind系列工具 ###1、valgrind 安装 valgrind 安装 2、打开QtCreator >> Analyze 你就会发现 这里已经有valgrind的相关选项了 如果没有的话, 在help >> about plugin >> C 中勾选 如图: 点击则可以直接运行…

python输入参数改变图形_Python基于Tensor FLow的图像处理操作详解
本文实例讲述了Python基于Tensor FLow的图像处理操作。分享给大家供大家参考,具体如下:在对图像进行深度学习时,有时可能图片的数量不足,或者希望网络进行更多的学习,这时可以对现有的图片数据进行处理使其变成一张新的…

CSS层叠样式
为了让网页元素的样式更加丰富,也为了让网页的内容和样式能拆分开,CSS由此思想而诞生,CSS是 Cascading Style Sheets 的首字母缩写,意思是层叠样式表。有了CSS,html中大部分表现样式的标签就废弃不用了,htm…

windows下 Source Monitor代码度量工具的使用
windows下 Source Monitor代码度量工具的使用 引用链接: https://www.cnblogs.com/xuehanyu/p/4520965.html 1.总体介绍 SourceMonitor是一款免费的软件,运行在Windows平台下。它可对多种语言写就的代码进行度量,包括C、C、C#、Java、VB、Delphi和HT…

MVVM 数据绑定
一、在 XAML 中创建绑定 定义源对象。 C# public class Dog {public string DogName { get; set; } }在 XAML 中创建对源对象的命名空间的引用。 XAML <UserControl x:Class"BindingXAML.Page" xmlns"http://schemas.microsoft.com/winfx/2006/xaml/pres…