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

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安装目录\bin的命令中找到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 Files\java8\jdk1.8.0_112\bin>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程序内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 解析Java内存分配和回收策略以及MinorGC、MajorGC、FullGC

    目录 对象内存分配与回收策略 对象何时进入新生代.老年代 三种GC介绍 MinorGC Major GC/Full GC: 图示GC过程 对象内存分配与回收策略 对象的内存分配,往大方向讲,就是在堆上分配[但也可能经过JIT编译后被拆散为标量类型并间接地栈上分配),对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配.少数情况下也可能会直接分配在老年代中. 对象优先分配在Eden区,当Eden区可用空间不够时会进行MinorGC 大对象直接进入老年代:大对

  • 浅谈JAVA8给我带了什么——流的概念和收集器

    到现在为止,笔者不敢给流下定义,从概念来讲他应该也是一种数据元素才是.可是在我们前面的代码例子中我们可以看到他更多的好像在表示他是一组处理数据的行为组合.这让笔者很难去理解他的定义.所以笔者不表态.各位同志自行理解吧. 在没有流以前,处理集合里面的数据一般都会用到显示的迭代器.用一下前面学生的例子吧.目标是获得学分大于5的前俩位同学. package com.aomi; import java.util.ArrayList; import java.util.Iterator; import j

  • Java SpringCache+Redis缓存数据详解

    目录 前言 一.什么是SpringCache 二.项目集成Spring Cache + Redis 1.配置方式 三.使用Spring Cache 四.SpringCache原理与不足 1.读模式 2.写模式:(缓存与数据库一致) 五.总结 前言 这几天学习谷粒商城又再次的回顾了一次SpringCache,之前在学习谷粒学院的时候其实已经学习了一次了!!! 这里就对自己学过来的内容进行一次的总结和归纳!!! 一.什么是SpringCache Spring Cache 是一个非常优秀的缓存组件.自

  • Java8 Stream Collectors收集器使用方法解析

    Collectors.toMap: Student studentA = new Student("20190001","小明"); Student studentB = new Student("20190002","小红"); Student studentC = new Student("20190003","小丁"); //Function.identity() 获取这个对象本身

  • 深入理解Java SpringCloud Ribbon 负载均衡

    目录 前言 1.抛出问题 2.源码解析 2.1.LoadBalancerIntercepor 2.2.LoadBalancerClient 2.3.负载均衡策略IRule 2.4.总结 3.负载均衡策略 总结 前言 该技术博客是关于黑马视频教程的笔记总结! 服务消费者需要通过RestTemplate调用注册中心(Eureka)的服务提供者,但当同一服务名称的服务有多个的时候,我们的服务消费者应该调用哪一个服务呢?这时候就需要我们学习理解Ribbon负载均衡的实现原理. 当我们在RestTempl

  • JAVA垃圾收集器与内存分配策略详解

    引言 垃圾收集技术并不是Java语言首创的,1960年诞生于MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言.垃圾收集技术需要考虑的三个问题是: 1.哪些内存需要回收 2.什么时候回收 3.如何回收 java内存运行时区域的分布,其中程序计数器,虚拟机栈,本地方法区都是随着线程而生,随线程而灭,所以这几个区域就不需要过多考虑回收问题.但是堆和方法区就不一样了,只有在程序运行期间我们才知道会创建哪些对象,这部分内存的分配和回收都是动态的.垃圾收集器所关注的就是这部分内存. 一 对象

  • Java SpringBoot整合SpringCloud

    目录 1. SpringCloud特点 2. 分布式系统的三个指标CAP 3. Eureka 4. SpringCloud Demo 4.1 registry 4.2 api 4.3 provider 4.4 consumer 4.5 POSTMAN一下 1. SpringCloud特点 SpringCloud专注于为典型的用例和扩展机制提供良好的开箱即用体验,以涵盖其他情况: 分布式/版本化配置 服务注册和发现 Eureka 路由 Zuul 服务到服务的呼叫 负载均衡 Ribbon 断路器 H

  • java 8如何自定义收集器(collector)详解

    需求: 将 一个容器List<Bean> 按照一定的字段进行分组,分组过后的值为特定的BEAN 里面的属性例如: 假定有这样一个Bean public class SubjectOberser{ private String subjectKey; private AbstractObserver abstractObserver; ...geter seter 方法... } 我们需要按照 subjectKey 进行分组,分组过后的内容 应该为这样一个容器Map<String,List

  • java中的GC收集器详情

    目录 1.GC(Garbage collection ) 2.GC算法 2.1标记活动对象 2.2 删除空闲对象 2.3 标记清除(Mark-Sweep) 2.4 清除压缩(Mark-Sweep-Compact) 2.5 标记和复制 3.JVM GC 3.1 JVM GC事件 3.2 Serial GC 3.3 Parallel GC 3.4 Concurrent Mark and Sweep 3.5 G1 –垃圾优先 4.总结 1.GC(Garbage collection ) 程序内存管理分

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

    jvisualvm介绍 VisualVM(All-in-One Java Troubleshooting Tool)是到目前为止随JDK发布的功能最强大的运行监视和故障处理程序,它提供了运行监视.故障处理.性能分析(Profiling)等功能.VisuaIVM有一个很大的优点:不需要被监视的程序基于特殊Agent运 行,因此它对应用程序的实际性能的影响很小,使得它可以直接应用在生产环境中. jdk8的文档中https://docs.oracle.com/javase/8/docs/technot

  • 教你如何监控 Java 线程池运行状态的操作(必看)

    之前写过一篇 Java 线程池的使用介绍文章<线程池全面解析>,全面介绍了什么是线程池.线程池核心类.线程池工作流程.线程池分类.拒绝策略.及如何提交与关闭线程池等. 但在实际开发过程中,在线程池使用过程中可能会遇到各方面的故障,如线程池阻塞,无法提交新任务等. 如果你想监控某一个线程池的执行状态,线程池执行类 ThreadPoolExecutor 也给出了相关的 API, 能实时获取线程池的当前活动线程数.正在排队中的线程数.已经执行完成的线程数.总线程数等. 总线程数 = 排队线程数 +

  • SHELL脚本监控JAVA进程的代码

    脚本内容:java_check.sh #! /bin/bash # if [ -z `pidof java` ]; then echo -e `date +%Y-%m-%d` `date +%R`. "33[31m33[1m(JAVA)Process does not exist! 33[0m" >> /data/logs/java_check.log /usr/local/tomcat/bin/startup.sh >/dev/null 2>&1 sl

  • zabbix通过percona插件监控mysql的方法

    1.安装PHP脚本运行环境 yum install -y php php-mysql 2.加载官方percona模板 [root@cat /]# wget https://www.percona.com/downloads/percona-monitoring-plugins/1.1.6/percona-zabbix-templates-1.1.6-1.noarch.rpm [root@cat /]# rpm -ivh percona-zabbix-templates-1.1.6-1.noarc

  • Java 程序员必备的 Intellij IDEA 插件

    1. ignore 生成各种ignore文件,一键创建git ignore文件的模板,免得自己去写 截图: 2. lombok 支持lombok的各种注解,从此不用写getter setter这些 可以把注解还原为原本的java代码 非常方便 截图: 3. p3c 阿里巴巴出品的java代码规范插件 可以扫描整个项目找到不规范的地方 并且大部分可以自动修复 4. FindBugs-IDEA 检测代码中可能的bug及不规范的位置,检测的模式相比p3c更多, 写完代码后检测下 避免低级bug,强烈建

  • IntelliJ IDEA安装插件阿里巴巴Java开发手册(Alibaba Java Coding Guidelines)

    以前看到过个:Java开发手册(阿里巴巴-公开版),这是个pdf文档,里面描述了一些Java开发的规约,里面确实有很多好用的规约,要是在学校就有机会看看的话,那么,在毕业之后,实际工作中就会少很多坑.现在,阿里巴巴又一次对这个文档进行了升级,直接变成了一个插件.你需要的就是:知道有这么个插件,然后,还得安装这个插件,那么以后,你在写代码的时候,这个插件就会自动的纠正你在写代码的时候的一些很low的不规范代码. 下面看怎么在这个 IntelliJ IDEA 上安装这个插件. 通过Jetbrains

  • 如何在Intellij中安装LeetCode刷题插件方便Java刷题

    一.安装 在 IDEA(2019)的 setting 的 Plugins 的 Marketplace 中搜索 leetcode,即可以找到该插件,安装完成了,重启即可. 二.配置 1.重启完成后,第一次使用的时候,需要一些基本的配制,在 setting 中的 Tools 中可以找到该插件工具,为 leetcode plugin,在里面,可以选择访问的为国际的 LeetCode 还是国内的,以及何种语言,同时,输入自己账户名(LoginName)和密码(Password),则可以和自己帐号关联起来

  • 使用idea插件进行java代码生成的操作

    java代码生成 使用idea的插件codehelper.generator进行代码生成,可以根据entity,生成对应的 1.建表sql语句 2.dao.java文件 3.dao.xml文件 4.service.java文件 同时这个插件还能在new了entity之后生成所有的set方法 多次生成,不会影响自己手动添加的代码 安装 安装插件codehelper.generator 案例 @Data @AllArgsConstructor @NoArgsConstructor public cl

  • Java程序员必备的11大IntelliJ插件(附地址)

    善用Intellij插件可大幅提升我们的效率 以下是我用过不错的Intellij插件 1. .ignore 地址:https://plugins.jetbrains.com/plugin/7495--ignore 生成各种ignore文件,一键创建git ignore文件的模板,免得自己去写 截图: 2. lombok 地址:https://plugins.jetbrains.com/plugin/6317-lombok-plugin 支持lombok的各种注解,从此不用写getter sett

  • 使用jib插件为Java应用构建镜像的方法

    目录 简介 使用Maven插件将Java应用构建为docker镜像 简介 Java应用开发的容器化,需要制作docker镜像.要是用户本地没安装docker,可以使用jib制作出带有镜像的tar文件. Jib提供了四种使用方式: Maven插件:jib-maven-plugin Gradle插件:jib-gradle-plugin Java库: Jlib Core Jib CLI jib构建工具主要包含了四个强大的功能. build :提供了创建镜像并推送到远程仓库功能. buildTar :提

随机推荐