JVM 内存监控与分析

本文详细介绍了JVM内存监控与分析,包括使用JVisualVm进行实时监控,如配置环境变量、运行工具、安装插件和程序监控。同时,讲解了离线分析工具,如GC日志分析和Heap Dump日志分析,帮助诊断内存问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1       内存监控与分析

1.1 实时监控工具

目前可用的实时监控工具包括Jprofile,JVisualVm,本文主要介绍JVisualVm的使用

1.1.1             Jvisualvm

   Visualvm为Sun Jdk自带的内存分析与监控工具,其存在2个版本,一个为JDK自带的版本,也有脱离于JDK的独立版本。JDK自带版本建议使用JDK1.6.45及以上版本;独立版本可于http://visualvm.java.net/ 下载。

1.1.1.1     工具运行

1.       配置环境变量 JAVA_HOME,PATH,主要目标将JDK的bin目录配置到PATH环境变量上去(Linux可同样配置)

2.       在Cmd窗口运行Jvisualvm,系统会做一些系统测算,点击确定后自动跳出如下界面

              blog_1.jpg

 

1.1.1.2     插件安装

建议插件为 visual gc

a)         在线安装

1.         菜单-工具-插件-可用插件

                           blog_2.jpg

2.         如上图,如果上图未刷新,可点击【重新载入目录】

b)        离线安装

1.         前往 http://visualvm.java.net/pluginscenters.html,选择对应版本的插件下载

2.         菜单-工具-插件-已下载-添加,添加下载下来的离线插件,然后按照提示步骤安装

1.1.1.3     程序监控

1.       运行对应的目标程序,如下图的tomcat WEB,Jvisualvm会出现如下界面,下图左侧会提示一个运行的程序tomcat

                  blog_3.jpg

 

2.       双击上图圈中的tomcat,会出现系统运行的一些配置参数,如下图,我方配置了内存参数 –Xms1100m –Xmx1100m,相关解释请见其他单元

   blog_4.jpg

 

3.       使用“监视”页面监控系统资源使用情况

在这里我们主要监控内存的使用

如下图:

blog_5.jpg

 

内存分为堆内存与PermGem内存,从上图可以看出PermGen占用为50M,最大为64M,占用率较高。

4.       使用visualgc观测内存使用情况

              blog_6.jpg

从上图可以看出内存主要分为Perm,Old,Eden,S0,S1,相关描述请见分代算法描述。

从上图看出Perm Gen的内存使用为51.83,当前分配为52M,最大限制为64M,这样极有可能会超过最大限制导致“java.lang.OutOfMemoryError: PermGen space”

 

 

 

1.2 离线分析工具

离线分析主要对如下日志进行分析

A.JVM的GC日志

对JVM的GC日志分析,可以分析程序运行所有阶段的内存使用情况,可以从中发现内存是否存在泄露和内存参数设置的合理性。

对GC文件分析的工具主要是IBM的IBM Pattern Modeling and Analysis Tool for Java Garbage Collector(ga443.jar)

B. 内存dump文件

对此类文件的分析,一般情况下是在程序已经发生Out Of Memory或者通过快捷键进行数据收集,通过对内存Dump文件进行分析,可以发现哪一类数据结构占用内存最多,通过分析这个可以获取具体的内存泄露的数据结构。

1.2.1              GC日志分析工具

1.2.1.1      GC日志收集
1.2.1.1.1      Sun Jdk
a)     配置参数

在运行程序的路径上使用  

 

-verbose:gc -Xloggc:%logname% -XX:+UseGCLogFileRotation

-XX:NumberOfGCLogFiles=20 -XX:GCLogFileSize=16M 

-XX:+PrintGCDetails -XX:+PrintHeapAtGC

-XX:+ PrintGCDateStamps -XX:+PrintTenuringDistribution

-XX:+PrintClassHistogram

 

         其中%logname%在测试时可以用具体的文件名,但是在生产环境跟踪可以考虑使用带日期的参数来生成,诸如下文

         @set tsp="%time:~0,1%"

        @if %tsp%==" "

(@set logname=%date:~0,4%%date:~5,2%%date:~8,2%_0%time:~1,1%%time:~3,2%%time:~6,2%)

                  & @goto LS

  @set logname=%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2%

 :LS

 @set logname=gclogs/gc_%logname%.log

 

       配置代码如下

    blog_7.jpg

b)     参数生效显示 

启动程序后,通过Jvisualvm可以看到,相关参数已生效

     blog_8.jpg

       同时,对应的gc日志文件会产生对应的日志文件

c)     收集日志简单分析

如下图,下图为一个完整的GC日志记录

     blog_9.jpg

 

记录信息包括:

1.       触发GC的时间,及触发Gc的原因(需要新生代39714816 bytes)字节

2.       触发GC前后的各代的内存分布

d)     使用工具分析

    blog_10.jpg

 

1.2.1.2    IBM Pattern Modeling and Analysis Tool

该工具可以分析多个JDK版本的产生的GC日志文件,包括

\内存分析工具\IBM\ga443.jar

blog_11.jpg

 

加载对应的gclog文件,可以得到如下图的日志统计分析,包括

1.       GC次数

2.       GC时间段

3.       各代的最大,最小,平均值等内存占用数据

通过下图红圈圈中的按钮(或者菜单-Analysis-Graph View All)可以看,各代内存的趋势分析,通常会分析Used Ternued(after)(即年老代GC后的内存)占用趋势图

blog_12.jpg

 

分析这个内存可以通过一些趋势来看程序的内存使用情况

1.       如果内存缓慢上升,从不下降,那么程序可能存在内存泄露

2.       如果内存变化非常陡峭,那么程序会存在大量分配短时间内存的可能

某生产环境典型内存使用情况:

       参数设置: -Xmx1000M

       经过连续测试后,已经定位到有问题的功能,通过连续使用该功能可形成如下的使用图,通过该工具可定位到有问题的功能。

blog_13.jpg

 

1.2.2             Heap Dump日志分析

1.2.2.1       日志收集
1.2.2.1.1      Sun Jdk

使用Jvisualvm进行head dump,如下图(或者使用菜单-【应用程序】-【堆Dump】

blog_14.jpg

 

这样可以得到堆Dump文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值