使用jvisualvm配合Visual GC插件监控Java程序详细总结

简介: 本节将会介绍一下jvisualvm的特性及作用、各个功能是如何使用的、最后会介绍jvisualvm的插件Visual GC的安装及使用

本节将会介绍一下jvisualvm的特性及作用、各个功能是如何使用的、最后会介绍jvisualvm的插件Visual GC的安装及使用

jvisualvm介绍

VisualVM(All-in-One Java Troubleshooting Tool)是到目前为止随JDK发布的功能最强大的运行监视和故障处理程序,它提供了运行监视、故障处理、性能分析(Profiling)等功能。VisuaIVM有一个很大的优点:不需要被监视的程序基于特殊Agent运

行,因此它对应用程序的实际性能的影响很小,使得它可以直接应用在生产环境中。

jdk8的文档中https://docs.oracle.com/javase/8/docs/technotes/tools/unix/index.html就有jvisualvm的使用介绍,

网络异常,图片无法展示
|

jvisualvm的官网介绍地址为:https://docs.oracle.com/javase/8/docs/technotes/guides/visualvm/index.html

VisualVM基于NetBeans平台开发,因此它一开始就具备了插件扩展功能的特性,通过插件扩展支持,visualVM可以做到:

  • 显示虚拟机进程以及进程的配置、环境信息(jps、jinfo)。
  • 监视应用程序的CPU、GC、堆、方法区以及线程的信息(jstat、jstack)。
  • dump以及分析堆转储快照(jmap、jhat)・
  • 方法级的程序运行性能分析,找出被调用最多、运行时间最长的方法。
  • 离线程序快照:收集程序的运行时配置、线程dump、内存dump等信息建立一个快照,可以将快照发送开发者处进行Bug反馈。
  • 其他plugins的无限的可能性(常用的Visual GC,BTrace,Threads Inspector )……

VisualvM可以监控本地和远程的Java应用程序,可能会有部分功能在监控远程应用程序时无法使用。在jdk安装目录in的命令中找到jvisualvm.exe双击打开即可使用。

jvisualvm使用介绍

打开jvisualvm后,可以看到如下界面,其可以监控本地和远程的Java应用程序,图中红框圈住的是本地程序,左侧显示的com.wkp.jvm.ServiceapiApplication (pid 8700)其实相当于 jps -l 命令的输出。可以看到有概述、监视、线程、抽样器和Profiler这几个功能菜单,而Visual GC是添加的插件,默认是没有的(下面会介绍这个插件)。

1、概述里面显示了JDK的版本、PID、JVM参数、系统属性等(相当于java -version,jps,jinfo等命令)。

网络异常,图片无法展示
|

Java应用程序如果想能够远程连接监控,可以通过JMX和jstatd,如果使用JMX则启动时要添加JMX相关的参数(具体的远程连接感兴趣的话,可以自己找文章看一下哈):

nohup java -jar -Djava.rmi.server.hostname=192.168.74.4 -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false test.jar &

2、监视菜单,可以看到如下界面:展示了CPU使用情况、堆内存大小及占用情况、类的装载和线程情况。点击堆Dump按钮会生成堆dump文件,相当于jmap命令。

网络异常,图片无法展示
|

双击打开上面生成的dump文件,可以看到如下所示:点击显示线程信息会看到线程dump信息(跟jstack命令输出的一样),然后还有类、实例数和OQL控制台,这个和前面介绍的MAT类似。

网络异常,图片无法展示
|

点击类按钮,会看到如下所示:可以看到类的实例数、大小等,还有一个重要功能"与另一个堆存储进行比较",

网络异常,图片无法展示
|

可以在执行GC前后分别产生堆dump文件,然后进行对比分析哪些对象有了变化、是如何变化的。

网络异常,图片无法展示
|

3、线程菜单, 可以看到所有的线程信息:线程数量、线程状态、线程名称、线程运行时间等,点击线程Dump按钮会跟jstack命令一样生成线程dump文件。

网络异常,图片无法展示
|

4、抽样器菜单,点击“CPU”按钮启动一个 CPU 性能分析会话 ,VisualVM 会检测应用程序所有的被调用的方法。当进入一个方法时,线程会发出一个“method entry”的事件,当退出方法时同样会发出一个“method exit”的事件,这些事件都包含了时间戳。然后 VisualVM 会把每个被调用方法的总的执行时间和调用的次数按照运行时长展示出来。

此外,我们也可以通过性能分析结果下方的方法名过滤器对分析结果进行过滤。

网络异常,图片无法展示
|

点击抽样器中的内存会看Java程序中的类的实例数、线程分配的内存等信息。

5、Profiler分析器:跟上面的抽样器类似,也可以选择CPU或者内存进行监控,这里就不贴图了。

如果你是通过双击jvisualvm.exe打开的,则在你点击Profiler中的CPU或者内存的时候会出现 VisualVm的Profiler一直转圈:正在连接到目标VM,解决方式就是通过命令启动,并且添加启动参数即可解决。

jvisualvm -J-Dorg.netbeans.profiler.separateConsole=true //-J即表示JVM OPTION:允许带JVM参数启动

C:Program Filesjava8jdk1.8.0_112in>jvisualvm -J-Dorg.netbeans.profiler.separateConsole=true

点击Profiler中的CPU会显示方法的执行时间、调用次数等

点击Profiler中的内存会对内存进行分析,会显示分配的对象,对象的大小,对象的年龄等信息。

Visual GC插件安装及使用

jvisulaVM如何添加插件:https://visualvm.github.io/index.html,visual GC插件下载地址为:https://visualvm.github.io/pluginscenters.html,根据自己的jdk版本选择对应的插件版本,并复制插件下载链接

网络异常,图片无法展示
|

点击VisualVm的工具->插件,开始的时候可能可用插件显示为0,可用在设置里面添加,把上面的链接地址复制进去,确定之后可用插件列表里面就可以看到了。在可用插件列表中选中,然后点击安装,安装完成后重启即可看到Visual GC插件。

网络异常,图片无法展示
|

打开Visual GC插件可以看到整个区域分为三部分:spaces、graphs、histogram

网络异常,图片无法展示
|

1,spaces区域:代表虚拟机内存分布情况。从图中可以看出,虚拟机被分为Metaspace、Old、Eden、S0、S1

2,Graphs区域:内存使用详细介绍

  • Compile Time(编译时间):图中显示编译了4070个类总耗时14.026s,一个驼峰表示一次JIT编译,越窄表示时间越短
  • Class Loader Time(类加载时间):表示加载、卸载类的数量、总消耗时间
  • GC Time(GC Time):显示GC次数、耗时、最近垃圾收集的原因
  • Eden Space(Eden 区):括号内的8.500M表示最大容量,8.500M表示当前容量,后面的2.259M表示当前占用空间,42 collections表示垃圾收集次数,239.693ms表示垃圾收集花费时间
  • Survivor 0/Survivor 1(S0和S1区):和Eden Space类似
  • Old Gen(老年代):和Eden Space类似
  • Metaspace(元空间):表示最大空间、当前空间、当前占用大小。

3,histogram:显示survivor区域对象的年龄

Visual GC的histogram可能会显示不受此JVM支持,因为是垃圾收集器的原因,Java应用默认使用UseParallelGC 并行收集器,这时候是不显示的,不用并行收集器就可以了,例如改为CMS+Parnew就能正常显示。

网络异常,图片无法展示
|

  • Tenuring Threshold:表示新生代年龄大于当前值则进入老年代
  • Max Tenuring Threshold:表示新生代最大年龄值。
  • Tenuring Threshold与Max Tenuring Threshold区别:Max Tenuring Threshold是一个最大限定,所有的新生代年龄都不能超过当前值,而Tenuring Threshold是个动态计算出来的临时值,一般情况与Max Tenuring Threshold相等,如果在Suivivor空间中,相同年龄所有对象大小的总和大于Survivor空间的一半,则年龄大于或者等于该年龄的对象就都可以直接进入老年代(如果计算出来年龄段是6,则Tenuring Threshold=6,age>=6的Suivivor对象都符合要求),它才是新生代是否进入老年代判断的依据。
  • Desired Survivor Size:Survivor空间大小验证阙值(默认是survivor空间的一半),用于Tenuring Threshold判断对象是否提前进入老年代。
  • Current Survivor Size:当前survivor空间大小

到此这篇关于使用jvisualvm配合Visual GC插件监控Java程序详细总结的文章就介绍到这了,更多相关jvisualvm 配合 Visual GC监控Java程序内容请搜索米米素材网以前的文章或继续浏览下面的相关文章希望大家以后多多支持米米素材网!

原文链接:https://www.mimisucai.com/teach/java/36643.html

相关文章
|
3月前
|
Java
轻松上手Java字节码编辑:IDEA插件VisualClassBytes全方位解析
本插件VisualClassBytes可修改class字节码,包括class信息、字段信息、内部类,常量池和方法等。
192 6
|
24天前
|
运维 监控 算法
企业局域网监控软件中 Java 优先队列算法的核心优势
企业局域网监控软件是数字化时代企业网络安全与高效运营的基石,犹如一位洞察秋毫的卫士。通过Java实现的优先队列算法,它能依据事件优先级排序,确保关键网络事件如异常流量、数据泄露等被优先处理,保障系统稳定与安全。代码示例展示了如何定义网络事件类并使用PriorityQueue处理高优先级事件,尤其在面对疑似风险时迅速启动应急措施。这一核心技术助力企业在复杂网络环境中稳健前行,护航业务腾飞。
62 32
|
4天前
|
传感器 安全 算法
消防救援支队消防员单兵装备智能养护舱电机驱动java版程序(二)
本文探讨消防救援中智能养护舱电机驱动的Java程序设计,作为系列文章第二部分。通过自动化和智能化手段,智能养护舱提升了装备维护效率与准确性。文章详细介绍了电机驱动模块的设计与实现,包括硬件选型、PID控制策略、安全保护机制及Java程序架构,确保电机精确控制、稳定性和安全性。未来将优化功能并引入智能算法和物联网技术,进一步提升装备维护智能化水平。
|
4天前
|
IDE Java 开发工具
消防救援支队消防员单兵装备智能养护舱点击驱动java版程序(一)
智能消防作战服架通过电机驱动系统提升消防员作业效率和安全性。本文介绍基于Java的电机驱动程序开发,涵盖硬件准备、软件环境搭建及驱动程序实现。重点包括串口通信配置、电机控制类设计与控制逻辑实现,确保电机高效稳定运行。通过正确配置通信协议和串口参数,并添加异常处理机制,保障系统的安全性和可靠性。
|
23天前
|
存储 监控 算法
探秘局域网桌面监控:深入剖析 Java 语言核心算法
在数字化办公时代,局域网桌面监控如同企业的“智慧鹰眼”,确保工作效率与数据安全。本文以Java为载体,揭示哈希表在监控中的关键应用。通过高效的数据结构和算法,哈希表能快速索引设备连接信息,大幅提升监控的时效性和响应速度。代码示例展示了如何用Java实现设备网络连接监控,结合未来技术如AI、大数据,展望更智能的监控体系,助力企业在数字化浪潮中稳健前行。
|
3月前
|
SQL 安全 Java
Java 异常处理:筑牢程序稳定性的 “安全网”
本文深入探讨Java异常处理,涵盖异常的基础分类、处理机制及最佳实践。从`Error`与`Exception`的区分,到`try-catch-finally`和`throws`的运用,再到自定义异常的设计,全面解析如何有效管理程序中的异常情况,提升代码的健壮性和可维护性。通过实例代码,帮助开发者掌握异常处理技巧,确保程序稳定运行。
65 2
|
3月前
|
IDE Java 编译器
开发 Java 程序一定要安装 JDK 吗
开发Java程序通常需要安装JDK(Java Development Kit),因为它包含了编译、运行和调试Java程序所需的各种工具和环境。不过,某些集成开发环境(IDE)可能内置了JDK,或可使用在线Java编辑器,无需单独安装。
122 1
|
3月前
|
SQL 监控 Java
Java连接池技术的最新发展,包括高性能与低延迟、智能化管理与监控、扩展性与兼容性等方面
本文探讨了Java连接池技术的最新发展,包括高性能与低延迟、智能化管理与监控、扩展性与兼容性等方面。同时,结合最佳实践,介绍了如何选择合适的连接池库、合理配置参数、使用监控工具及优化数据库操作,以实现高效稳定的数据库访问。示例代码展示了如何使用HikariCP连接池。
29 2
|
27天前
|
监控 Java
java异步判断线程池所有任务是否执行完
通过上述步骤,您可以在Java中实现异步判断线程池所有任务是否执行完毕。这种方法使用了 `CompletionService`来监控任务的完成情况,并通过一个独立线程异步检查所有任务的执行状态。这种设计不仅简洁高效,还能确保在大量任务处理时程序的稳定性和可维护性。希望本文能为您的开发工作提供实用的指导和帮助。
85 17
|
2月前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者