使用java VisualVM工具监控JVM

news/2024/7/20 14:45:08 标签: 内存管理, 运维, java

JDK中有个好用的工具“VisualVM”可以实时可视化的查看到java程序内存变化情况,对于理解GC和java内存管理还是有很大帮助的,以前看论坛看帖子讲到java内存管理真是各说纷纭啊!有人说“JVM的内存分为两块堆和栈”,还有人说"JVM的内存分为三块(新生代、老年代、方法区)",想必很多人和我一样都搞得有点摸不着头脑了吧。下面来眼见为实:

    工欲善其事必先利其器,首先要给VisualVM安装一些插件便于我们观察jvm的内存管理情况,

1         VisualVM简单介绍

1.1    打开VisualVM(这个工具放在JDK安装目录的bin目录下,双击jvisualvm.exe即可打开),如下图所示

1.2    以VisualVM自身为例,VisualVM本身也是一个java程序,当然也而已用VisualVM来分析

1.3    概述页面主要显示程序的启动参数和系统信息(如下图所示)            

 PID -- 程序启动后的进程号,在命令行中可以用 jps命令查看

 主机 -- 如果是本机的话显示,localhost,如果是远程主机应该是显示远程主机的主机名或者IP

 主类 -- 程序入口类(main方法所在的类)

 参数 -- VisualVm 启动的时候使用的一些配置文件路径

JVM -- jvm类型

Java -- jdk的版本信息

Java Home -- JDK安装目录

JVM参数 -- VisualVm 启动时候设置的JVM参数

系统属性 -- java环境的系统参数

1.4    监视页面主要展示 系统资源占用情况(如下图所示)

Ø  CPU -- 展示java程序运行的时候占用的cpu资源 如下图中橙色的表示程序运行使用的cpu资源百分比,蓝色部分表示垃圾回收占用CPU资源百分比

Ø  堆 -- 这里要说明下堆内存的组成部分,堆是由老年代和新生代组成,其中新生代有由"伊甸园"和"两个幸存区组成"三部分组成,堆视图看到的资源占用实际是"老年代"、"伊甸园(Eden)"、"两个幸存者(Survivor )"的一个综合情况。

Ø  PermGen --  Perm 区用来存放java类以及其他虚拟机自己的静态数据,(常被称为持久代或者方法区)

Ø  类 -- 此视图 主要展示 当前程序加载了多少个类

Ø  线程 -- 当前程序的线程启动情况

§  执行垃圾回收 -- 手动触发一次GC 相当于在程序代码中调用(System.gc()),如果是远程连接到生产环境中请慎重点击。

§  堆Dump -- 生产当前程序的内存快照hprof文件,对于分析内存溢出问题比较有帮助。(可以查看当前程序内存中的所有对象)

1.5    线程页面(主要展示程序中所有的线程运行状态)

Ø  线程dump – 此按钮主要生产当前程序中所有线程的快照(对分析线程死锁,比较有帮助)

Ø  时间线 – 展示每个线程的实时运行状态(不同颜色代表不同的状态)

Ø  表 – 按照二维表格的形式展示每个线程不同状态的时间统计信息

Ø  详细信息 – 用饼图展示每个线程的运行状态

 

1.6    抽样器(应该算是线程页面功能的一个补充)

CPU-> CPU样例 – 主要展示方法消耗的CPU资源比例和时间

CPU->线程CPU时间 – 主要展示线程消耗的CPU资源信息

内存-> 堆柱状图 – 展示堆内存中各种对象占用的字节数和总实例数

内存->PermGen – 展示方法区各种对象消耗的内存情况

内存-> 每个线程分配—展示不同线程占用内存的情况

1.7    增加VisualGC插件

1.7.1    点击 工具->插件,然后在插件页面进入可用插件页面,点击检查更新,如下图所示会展示所有可用插件

1.7.2    选择VisualGC并点击安装,安装完成之后需要重新打开分析页面就能看到VisualGC页面,如下所示

根据VisualGC中的信息可以调整程序的启动参数,这样就不会再这是启动参数的时候拍脑袋了(以前工作中设置Tomcat的启动参数的时候确实是在拍脑袋)。

按照此图中的信息来看Eden区域GC次数明显过多,可以增大此区域的内存用来减少GC次数。

 

对于开篇引出的话题有人说“JVM的内存分为两块堆和栈”,还有人说"JVM的内存分为三块(新生代、老年代、方法区)"该有个结论了

对于堆栈说法的人他们是根据下图中的维度来看问题的

对于分代说法的人是根据下图中的维度来看待的

不能说谁对谁错吧,只是看待问题的维度不同而已,这里应该明确一下它们的关系

堆 = Old+Eden+S0+S1(下图中红色圈中的范围)

栈 = PerM区 下图中蓝色圈中的范围

 

转载于:https://www.cnblogs.com/pypua/articles/7520988.html


http://www.niftyadmin.cn/n/1699386.html

相关文章

新建ubuntu虚拟机用其它VirtualBox虚拟硬盘cannot find device eth

2019独角兽企业重金招聘Python工程师标准>>> 最近将笔记本上的ubuntu虚拟机迁移到台式机上,新建virtualbox虚拟机后,将vdi文件加入,开机能启动ubuntu,但是一直无法找到网卡 查看硬件网卡状态 sudo lshw -numeric -clas…

MySQL 8.0安装、配置和密码修改记录

1.MySQL下载 可以在MySQL的官网上下载,https://www.mysql.com/,但是我在安装的时候下载的速度太慢了,所以我选择了在国内的镜像网站上下载,https://mirrors.tuna.tsinghua.edu.cn/mysql/downloads/MySQL-8.0/,在window下安装的话…

faster rcnn环境编译

步骤和fast rcnn的编译一样,在编译中遇到了一个问题: 刚开始是以为python-numpy没有安装到位,后来发现是Makefile.config的配置出现了问题。原来的配置是: PYTHON_INCLUDE : /usr/include/python2.7 \ /usr/lib/python2.…

解决虚拟机上的centos7系统的无IP地址或者只有一个127.0.0.1地址问题记录

问题描述 问题描述:在虚拟机上刚刚搭建的centos7系统中,通过使用ip addr命令查看发现没有ip地址,就导致无法使用xshell等软件进行远程使用问题 在网上查找的问题原因是:因为centos7默认没有开启网卡,需要通过设置手动…

Wireshark数据包分析过滤器用法

为什么80%的码农都做不了架构师&#xff1f;>>> 过滤器 常用端口说明&#xff1a; 端口端口说明备注23Telnet协议是TCP/IP协议族中的一员&#xff0c;是Internet远程登陆服务的标准协议和主要方式。80‍443sslhttp‍1.扑捉指定<host>主机 [src|dst] host <…

centos系统的静态IP、主机名、防火墙、SSH免密码登陆、JDK的安装和配置

1.静态IP 静态ip的设置和打开的centos系统的网卡是一个配置文件&#xff0c;所有静态ip的设置的文件就是 /etc/config/network-scripts/ifcfg-ens33 进入此文件修改三个地方即可 注意&#xff1a;这个地方的IP、网关和dns的设置需要和自己虚拟机上的地址段相同&#xff0c;自…

SDOI2017 R2泛做

由于各种原因&#xff0c;在bzoj上我day1的题一题都没过&#xff0c;所以这里就直接贴loj的链接好了。 D1T1 龙与地下城 中心极限定理。 https://en.wikipedia.org/wiki/Central_limit_theorem 由于某些原因这里的公式挂了...直接看维基吧... 要算积分可以用标准库里的erf&…

Hadoop的格式化和启动

在未配置环境变量的情况下&#xff0c;先进入到Hadoop文件中&#xff0c;Hadoop的其余配置已经完成 1.格式化 bin/hdfs namenode -format 进行格式化 如果想要格式化失败或者想要重新格式化&#xff0c;请删除配置文件中配置的 hadoop_repo 整个文件夹 2.启动 在Hadoop文件…