1、VisualVM 简介


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

2、Tomcat远程监控配置


2.1启动visualvm
命令行运行jvisualvm

2.2JMX 配置

远程机器的程序需要加上JVM参数
-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.port=8099(配置远程 connection 的端口号的)
-Dcom.sun.management.jmxremote.ssl=false(指定了 JMX 是否启用 ssl)
-Dcom.sun.management.jmxremote.authenticate=false( 指定了JMX 是否启用鉴权(需要用户名,密码鉴权))
-Djava.rmi.server.hostname=192.168.0.1(配置 server 的 IP)

备注:另外需要检查 hostname –i,看解析出来是否为本地的IP,如是127.0.0.1或者IP为多个IP中之一,则其他的IP无效,会连接不上。

2.3jstatd 配置

找到需要远程连接的Linux服务器的jdk的bin目录,在其下面建立一个指定安全策略的文件 jstatd.policy 文件,内容如下:

grant codebase “file:${java.home}/../lib/tools.jar” {
permission java.security.AllPermission;
};
然后在远程主机上启动 jstatd 并且不要关闭。
启动命令:jstatd -J-Djava.security.policy=jstatd.policy -p 1099
这样就可以在 JVisualVM 上,添加远程主机,并且设置 jstatd 的端口就可以了。

3、Dump


VisualVM 能够生成堆转储,统计某一特定时刻 JVM 中的对象信息,帮助我们分析对象的引用关系、是否有内存泄漏情况的发生等。

3.1堆dump

当 VisualVM 统计完堆内对象数据后,会把堆转储信息显示在新的堆转储标签内,我们可以看到摘要、类、实例数等信息以及通过 OQL 控制台执行查询语句功能。
A. 堆转储的摘要包括转储的文件大小、路径等基本信息,运行的系统环境信息,也可以显示所有的线程信息。

B. 从类视图可以获得各个类的实例数和占用堆大小数,分析出内存空间的使用情况,找出内存的瓶颈,避免内存的过度使用。

C. 还能对两个堆转储文件进行比较。通过比较我们能够分析出两个时间点哪些对象被大量创建或销毁。

3.2线程Dump


线程状态:
 RUNNABLE: 运行中状态,可能里面还能看到locked字样,表明它获得了某把锁。
 BLOCKED:被某个锁(synchronizers)給block住了。
 WAITING:等待某个condition或monitor发生,一般停留在park(), wait(), sleep(),join() 等语句里。
 TIME_WAITING:和WAITING的区别是wait() 等语句加上了时间限制 wait(timeout)。

4、CPU


VisualVM 能够监控应用程序在一段时间的 CPU 的使用情况,显示 CPU 的使用率、方法的执行效率和频率等相关数据帮助我们发现应用程序的性能瓶颈。我们可以通过 VisualVM 的监视标签和抽样器标签对应用程序进行 CPU 性能分析。
4.1CPU 监视
在监视标签内,我们可以查看 CPU 的使用率以及垃圾回收活动对性能的影响。
1、过高的 CPU 使用率可能是由于我们的项目中存在低效的代码,可以通过 Profiler 标签的 CPU 性能分析功能进行详细的分析。
2、如果垃圾回收活动过于频繁,占用了较高的 CPU 资源,可能是由内存不足或者是新生代和旧生代分配不合理导致的等。

在抽样器标签,点击“CPU”按钮启动一个 CPU 性能分析会话 ,VisualVM 会检测应用程序所有的被调用的方法。当进入一个方法时,线程会发出一个“method entry”的事件,当退出方法时同样会发出一个“method exit”的事件,这些事件都包含了时间戳。然后 VisualVM 会把每个被调用方法的总的执行时间和调用的次数按照运行时长展示出来。
此外,我们也可以通过性能分析结果下方的方法名过滤器对分析结果进行过滤。

4.2 CPU 快照
当有一个性能分析会话(内存或者 CPU)正在进行时,我们可以通过性能分析结果工具栏的“快照”按钮生成 Profiler 快照捕获当时的性能分析数据。

5、线程


Java 语言能够很好的实现多线程应用程序。当我们对一个多线程应用程序进行调试或者开发后期做性能调优的时候,往往需要了解当前程序中所有线程的运行状态,是否有死锁、热锁等情况的发生,从而分析系统可能存在的问题。

5.1线程监视
在 VisualVM 的监视标签内,我们可以查看当前应用程序中所有活动线程和守护线程的数量等实时信息。

5.2线程插件安装
1、从主菜单中选择“工具”>“插件”。

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

5.3死锁例子
从线程图中,我们可以很轻易地找到这种可疑特征:两个(或多个)线程长期同时处于”监视(被阻塞)”状态,提示“检查到死锁”说明它们出现了死锁,应当生成dump查到详细内容。
2、生成dump后,在dump的最下面有关于锁的说明

VisualVM使用方法相关推荐

  1. Java系统资源消耗定位概述

    通常运行的Java程序遇到性能问题表象是资源消耗过多.外部处理系统的性能不足,或者资源消耗不多,但是程序响应速度却达不到要求. 资源主要消耗在CPU .文件IO.网络IO以及内存方面,机器资源是有限的 ...

  2. 长文讲解Linux内核性能优化的思路和步骤

    一.性能调优简介 1.为什么要进行性能调优? 1) 编写的新应用上线前在性能上无法满足需求,这个时候需要对系统进行性能调优 2) 应用系统在线上运行后随着系统数据量的不断增长.访问量的不断上升,系统的 ...

  3. 性能优化的思路和步骤

    https://download.csdn.net/download/qq_30353203/10616634,这是一个JVM体系结构与GC调优PPT,写的非常好. 我的技术公众号,有兴趣可以关注一起 ...

  4. 在 Oracle Enterprise Linux 和 iSCSI 上构建您自己的 Oracle RAC 11g 集群

    作者:Jeffrey Hunter 了解如何以低于 2,700 美元的费用在 Oracle Enterprise Linux 上安装并配置 Oracle RAC 11g 第 2 版开发集群. 本指南中 ...

  5. Java面试题大全2021版

    一.Java 基础 JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境. JRE:Java Run ...

  6. 【java】IDEA安装VisualVM插件-使用介绍 检测死锁 内存 cpu 慢方法

    文章目录 1.美图 2.概述 3.安装 4.查看程序的JVM内存 5.查看程序的线程情况 6.VisualGC 7. CPU分析篇 M.参考 1.美图 2.概述 3.安装 File-> Sett ...

  7. java vm for mac_Java VisualVM for Mac 构建方法

    感觉很奇怪,,VisualVM移到了github上,并且貌似不提供下载安装包.自己搞了一会,记录一下构建过程: 1. 从github上拉取或者下载最新的代码 2.按照github wiki上的介绍,首 ...

  8. JVM内存调优原则及几种JVM内存调优方法

    JVM内存调优原则及几种JVM内存调优方法 1.堆大小设置. 2.回收器选择. 1.在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因 ...

  9. Tomcat内存溢出解决方法

    Java内存溢出详解 一.常见的Java内存溢出有以下三种: 1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出 JVM在 ...

最新文章

  1. 成功解决sys:1: DtypeWarning: Columns (39,41,42,217) have mixed types.Specify dtype option on import or s
  2. 05 JS基础DOM
  3. 按关键字截取linux日志,linux awk截取数据,如何根据第二部分数据的关键字‘aaaaa’获取整串数据...
  4. UOJ59 WC2013 小Q运动季
  5. 在传统行业做数字化转型之团队篇
  6. 《LINUX与UNIX SHELL编程指南》学习笔记
  7. ShaderLab学习小结(四)简单产生阴影
  8. 大数据平台应用开发的痛点有哪些
  9. python 数字类型判断_Python中 各种数字类型的判别(numerica, digital, decimal)
  10. .NET应用程序与数据库交互的若干问题
  11. 2021智能仓储物流之最全AGV企业供应商名录整理分享~
  12. 谷“哥”性丑闻还要对谷姐性侵犯?
  13. 【图像重建】基于Split Bregman实现稀疏图像重建附matlab代码
  14. 根据点云及其对应的四元数与GPS计算出其相对坐标系的经纬坐标(matlab)
  15. Java全栈学习路线-拭去心尘
  16. linux下进入隐藏文件夹命令,Linux命令-----grep不查找隐藏文件夹的方法
  17. es(Elasticsearch)客户端Elasticsearch-head安装使用(04Elasticsearch-head安装篇)
  18. 2021赤峰市地区高考成绩排名查询,2021年赤峰高考状元是谁分数多少分,历年赤峰高考状元名单...
  19. smalltalk资源
  20. 众筹之家9月股权众筹行业简报

热门文章

  1. 数学建模美赛特等奖提名、国赛国一队伍经验分享
  2. 最新WIN10 64位21H2正式版19044.2006
  3. 三维点云拼接 标记点拼接 SVD分解法
  4. concurrent包
  5. 12个球和一个天平,现知道只有一个和其它的重量不同,问怎样称才能用三次就找到那个球,13个呢
  6. java实现冒泡排序 (2012-05-23 10:18:22)
  7. Linux FrameBuffer(一) —— FrameBuffer是什么?怎么用?
  8. 《APUE》在Ubuntu上使用apue.h
  9. Linux Kernel Panic报错解决思路
  10. python打印日历_Python实战练习——打印日历教程