前几篇篇文章介绍了介绍了JVM的参数设置并给出了一些生产环境的JVM参数配置参考方案。正如之前文章中提到的JVM参数的设置需要根据应用的特性来进行设置,每个参数的设置都需要对JVM进行长时间的监测,并不断进行调整才能找到最佳设置方案。本文将介绍如果通过工具及Java api来监测JVM的运行状态,并详细介绍各工具的使用方法。

需要监测的数据:(内存使用情况 谁使用了内存 GC的状况)

内存使用情况--heap&PermGen

@ 表示通过jmap –heap pid 可以获取的值

# 表示通过jstat –gcutil pid 可以获取的值

参数的查看可以通过多种方法 本文中只随机列出一种。

描述 最大值 当前值 报警值
堆内存 @Heap Configuration::MaxHeapSize
sum(eden+servivor+old)
sum(eden+servivor+old) 自设
非堆内存 sum(perm+native)  
Eden @Eden Space::capacity @Eden Space::used
Survivor0 @From Space::capacity @From Space::used
Survivor1 @To Space::capacity @To Space::used
New gen
(注意区别于Xmn参数设置)
@New Generation::capacity
Eden + 1 Survivor Space
@New Generation::used
Old gen @concurrent mark-sweep generation::capacity
(CMS是对old区的gc,所以此处即表示old gen)
@concurrent mark-sweep generation::capacity(CMS)::used 自设
Perm Gen @Perm Generation::capacity @Perm Generation::used 自设

内存使用情况--config

描述 配置值
MaxTenuringThreshold jinfo -flag MaxTenuringThreshold pid
MinHeapFreeRatio @Heap Configuration::MinHeapFreeRatio
MaxHeapFreeRatio @Heap Configuration::MaxHeapFreeRatio
new gen gc @using … in the new generation
old gen gc new gen gc声明下方
类总数统计 ??

内存使用情况—C heap

  • top or ps aux

谁使用了内存

  • Heap
    jmap –histo
    jmap –dump ,then mat
  • C heap
    google perftools

GC的状况

描述 收集次数 收集时间 应用暂停时间
Full GC #FGC #FGCT 设置-XX:+PrintGCApplicationStoppedTime后在日志中查看
Young GC #YGC #YGCT 同上

-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC  -XX:+PrintGCApplicationStoppedTime  -Xloggc:logs/gc.log

常用工具介绍:jinfo jmap jstack jstat

jinfo

  • 可以从一个给定的java进程或core文件或远程debug服务器上获取java配置信息。包括java系统属性及JVM参数(command line flags)。注意在jvm启动参数中没有配置的参数也可使用jinfo –flag xxx pid输出默认值(很有用,但貌似一些简写的参数查不出来)。
  • 可以修改运行时的java 进程的opts。
  • 只有solaris和linux的JDK版本里有。
  • 使用方式可使用jinfo –h 查询。

jmap

观察运行中的jvm物理内存的占用情况。

如果连用SHELL jmap -histo pid>a.log可以将其保存到文本中去,在一段时间后,使用文本对比工具,可以对比出GC回收了哪些对象。

参数很简单,直接查看jmap -h

举例:

jmap -heap pid

jmap -dump:format=b,file=heap.hprof <pid>

 
dump文件可以通过MemoryAnalyzer分析查看.网址:http://www.eclipse.org/mat/,可以查看dump时对象数量,内存占用,线程情况等。

jstack

观察jvm中当前所有线程的运行情况和线程当前状态

如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。目前只有在Solaris和Linux的JDK版本里面才有。

参数很简单,直接查看jstack -h

举例:

jstack pid

jstat

JVM监测工具(Java Virtual Machine Statistics Monitoring Tool)。利用了JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括各种堆和非堆的大小及其内存使用量、classloader、compiler、垃圾回收状况等。

举例:

jstat –printcompilation -h10 3024 250 600

每250毫秒打印一次,一共打印600次 每隔10行显示一次head

语法结构:
Usage: jstat -help|-options
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

参数介绍:

  • -h n 每隔几行输出标题
  • vmid VM的进程号,即当前运行的java进程号
  • -t 在第一列显示自JVM启动以来的时间戳
  • -J 修改java进程的参数。类似jinfo -flag <name>=<value>。例如-J-Xms48m 设置初始堆为48M。详见这里。这个参数挺有用的,可以在运行中调整参数以方便测试、监测。
  • -option option为要检测的参数。参数列表可通过jstat –options 获取。下面将分别介绍每个参数及输出字段的含义。
class 统计class loader行为信息
compiler 统计编译行为信息
gc 统计jdk gc时heap信息
gccapacity 统计堆内存不同代的heap容量信息
gccause 统计gc的情况(同-gcutil)和引起gc的事件
gcnew 统计gc时新生代的信息(相比gcutil更详细)
gcnewcapacity 统计gc时新生代heap容量
gcold 统计gc时,老年区的情况
gcoldcapacity 统计gc时,老年区heap容量
gcpermcapacity 统计gc时,permanent区heap容量
gcutil 统计gc时,heap情况
printcompilation 统计编译行为信息

-class option:Class Loader Statistics

Column Description
Loaded Number of classes loaded.
Bytes Number of Kbytes loaded.
Unloaded Number of classes unloaded.
Bytes Number of Kbytes unloaded.
Time Time spent performing class load and unload operations.

-compiler:HotSpot Just-In-Time Compiler Statistics

Column Description
Compiled Number of compilation tasks performed.
Failed Number of compilation tasks that failed.
Invalid Number of compilation tasks that were invalidated.
Time Time spent performing compilation tasks.
FailedType Compile type of the last failed compilation.
FailedMethod Class name and method for the last failed compilation.

-gc Option:Garbage-collected heap statistics

Column Description
S0C Current survivor space 0 capacity (KB).
S1C Current survivor space 1 capacity (KB).
S0U Survivor space 0 utilization (KB).
S1U Survivor space 1 utilization (KB).
EC Current eden space capacity (KB).
EU Eden space utilization (KB).
OC Current old space capacity (KB).
OU Old space utilization (KB).
PC Current permanent space capacity (KB).
PU Permanent space utilization (KB).
YGC Number of young generation GC Events.
YGCT Young generation garbage collection time.
FGC Number of full GC events.
FGCT Full garbage collection time.
GCT Total garbage collection time.

-gccapacity Option:Memory Pool Generation and Space Capacities

Column Description
NGCMN Minimum new generation capacity (KB).
NGCMX Maximum new generation capacity (KB).
NGC Current new generation capacity (KB).
S0C Current survivor space 0 capacity (KB).
S1C Current survivor space 1 capacity (KB).
EC Current eden space capacity (KB).
OGCMN Minimum old generation capacity (KB).
OGCMX Maximum old generation capacity (KB).
OGC Current old generation capacity (KB).
OC Current old space capacity (KB).
PGCMN Minimum permanent generation capacity (KB).
PGCMX Maximum Permanent generation capacity (KB).
PGC Current Permanent generation capacity (KB).
PC Current Permanent space capacity (KB).
YGC Number of Young generation GC Events.
FGC Number of Full GC Events.

-gccause Option:Garbage Collection Statistics, Including GC Events

Column Description
LGCC Cause of last Garbage Collection.
GCC Cause of current Garbage Collection.

前面的字段与gcutil相同.

-gcnew Option:New Generation Statistics

Column Description
S0C Current survivor space 0 capacity (KB).
S1C Current survivor space 1 capacity (KB).
S0U Survivor space 0 utilization (KB).
S1U Survivor space 1 utilization (KB).
TT Tenuring threshold.
MTT Maximum tenuring threshold.
DSS Desired survivor size (KB).
EC Current eden space capacity (KB).
EU Eden space utilization (KB).
YGC Number of young generation GC events.
YGCT Young generation garbage collection time.

-gcnewcapacity Option:New Generation Space Size Statistics

Column Description
NGCMN            Minimum new generation capacity (KB). 
NGCMX     Maximum new generation capacity (KB).
NGC     Current new generation capacity (KB).
S0CMX Maximum survivor space 0 capacity (KB).
S0C Current survivor space 0 capacity (KB).
S1CMX Maximum survivor space 1 capacity (KB).
S1C Current survivor space 1 capacity (KB).
ECMX Maximum eden space capacity (KB).
EC Current eden space capacity (KB).
YGC Number of young generation GC events.
FGC Number of Full GC Events.

-gcold Option:Old and Permanent Generation Statistics

Column Description
PC Current permanent space capacity (KB).
PU Permanent space utilization (KB).
OC Current old space capacity (KB).
OU old space utilization (KB).
YGC Number of young generation GC events.
FGC Number of full GC events.
FGCT Full garbage collection time.
GCT Total garbage collection time.

-gcoldcapacity Option:Old Generation Statistics

Column Description
OGCMN Minimum old generation capacity (KB).
OGCMX Maximum old generation capacity (KB).
OGC Current old generation capacity (KB).
OC Current old space capacity (KB).
YGC Number of young generation GC events.
FGC Number of full GC events.
FGCT Full garbage collection time.
GCT Total garbage collection time.

-gcpermcapacity Option: Permanent Generation Statistics

Column Description
PGCMN Minimum permanent generation capacity (KB).
PGCMX Maximum permanent generation capacity (KB).
PGC Current permanent generation capacity (KB).
PC Current permanent space capacity (KB).
YGC Number of young generation GC events.
FGC Number of full GC events.
FGCT Full garbage collection time.
GCT Total garbage collection time.

-gcutil Option:Summary of Garbage Collection Statistics

Column Description
S0 Survivor space 0 utilization as a percentage of the space's current capacity.
S1 Survivor space 1 utilization as a percentage of the space's current capacity.
E Eden space utilization as a percentage of the space's current capacity.
O Old space utilization as a percentage of the space's current capacity.
P Permanent space utilization as a percentage of the space's current capacity.
YGC Number of young generation GC events.
YGCT Young generation garbage collection time.
FGC Number of full GC events.
FGCT Full garbage collection time.
GCT Total garbage collection time.

-printcompilation Option: HotSpot Compiler Method Statistics

Column Description
Compiled Number of compilation tasks performed.
Size Number of bytes of bytecode for the method.
Type Compilation type.
Method Class name and method name identifying the compiled method. Class name uses "/" instead of "." as namespace separator. Method name is the method within the given class. The format for these two fields is consistent with the HotSpot - XX:+PrintComplation option.

Java api方式监测

jre中提供了一些查看运行中的jvm内部信息的api,这些api包含在java.lang.management包中,此包中的接口是在jdk 5中引入的,所以只有在jdk 5及其以上版本中才能通过这种方式访问这些信息。下面简单介绍一下这包括哪些信息,以及如何访问。

可以通过此api访问到运行中的jvm的类加载的信息、jit编译器的信息、内存分配的情况、线程的相关信息以及运行jvm的操作系统的信息。java.lang.management包中提供了9个接口来访问这些信息,使用ManagementFactory的静态get方法可以获得相应接口的实例,可以通过这些实例来获取你需要的相关信息。

更详细的关于MBean的介绍参见Java SE 6 新特性: JMX 与系统管理

demo1:查看一下当前运行的jvm中加载了多少个类。想详细了解如何使用这些api,可以参考java.lang.management包中的详细api文档。

public class ClassLoaderChecker {
public static void main( String[] args ) throws Exception {
      ClassLoadingMXBean bean = ManagementFactory.getClassLoadingMXBean();
      System.out.println( bean.getLoadedClassCount() );
    }
}

demo2:自定义Mbean Type,记录的数据可通过jconsole等工具或自写代码查看,

//工具方法

public static ObjectName register(String name, Object mbean) {
try {
ObjectName objectName = new ObjectName(name);

MBeanServer mbeanServer = ManagementFactory
.getPlatformMBeanServer();

try {
mbeanServer.registerMBean(mbean, objectName);
} catch (InstanceAlreadyExistsException ex) {
mbeanServer.unregisterMBean(objectName);
mbeanServer.registerMBean(mbean, objectName);
}

return objectName;
} catch (JMException e) {
throw new IllegalArgumentException(name, e);
}
}

//步骤一:定义Mbean接口:
//随便定义
public interface DemoMBean {
      public AtomicLong getInvokeCount();
}
//步骤二:实现接口,并注册:
public class DemoImpl implements DemoMBean{
      public final static String DEFAULT_OBJECT_NAME_PREFIX = "com.redcreen.demo:type=demo";
      register("com.redcreen.demo:type=demo",DemoImpl.instance);
}
//可以通过jconsole中查看数据了
 
 

相关推荐文章:

在 Java SE 6 中监视和诊断性能问题

参考:

http://www.51testing.com/?uid-183198-action-viewspace-itemid-185174

JVM监控工具介绍jstack, jconsole, jinfo, jmap, jdb, jstat

http://stl-www.htw-saarland.de/syst-lab/java/jdk-1_5_0/docs/tooldocs/share/jinfo.html

http://qa.taobao.com/?p=10010

运用Jconsole监控JVM

http://www.coderanch.com/t/329407/java/java/find-all-loaded-classes-classloaders

JVM系列五:JVM监测&工具[整理中]的更多相关文章

  1. JVM系列五:JVM监测&工具

    JVM系列五:JVM监测&工具[整理中]  http://www.cnblogs.com/redcreen/archive/2011/05/09/2040977.html 前几篇篇文章介绍了介 ...

  2. [转]JVM系列五:JVM监测&工具[整理中]

    原文地址:http://www.cnblogs.com/redcreen/archive/2011/05/09/2040977.html 前几篇篇文章介绍了介绍了JVM的参数设置并给出了一些生产环境的 ...

  3. jvm系列(五):jvm调优-从eclipse开始

    概述 什么是jvm调优呢?jvm调优就是根据gc日志分析jvm内存分配.回收的情况来调整各区域内存比例或者gc回收的策略:更深一层就是根据dump出来的内存结构和线程栈来分析代码中不合理的地方给予改进 ...

  4. jvm系列(七):jvm调优-工具篇

    16年的时候花了一些时间整理了一些关于jvm的介绍文章,到现在回顾起来还是一些还没有补充全面,其中就包括如何利用工具来监控调优前后的性能变化.工具做为图形化界面来展示更能直观的发现问题,另一方面一些耗 ...

  5. jvm系列(五):Java GC 分析

    Java GC就是JVM记录仪,书画了JVM各个分区的表演. 什么是 Java GC Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之 ...

  6. jvm系列(八):jvm知识点总览-高级Java工程师面试必备

    在江湖中要练就绝世武功必须内外兼备,精妙的招式和深厚的内功,武功的基础是内功.对于武功低(就像江南七怪)的人,招式更重要,因为他们不能靠内功直接去伤人,只能靠招式,利刃上优势来取胜了,但是练到高手之后 ...

  7. jvm系列(四):jvm知识点总结

    原文链接:http://www.cnblogs.com/ityouknow/p/6482464.html jvm 总体梳理 jvm体系总体分四大块: 类的加载机制 jvm内存结构 GC算法 垃圾回收 ...

  8. jvm系列(八):jvm知识点总览

    在江湖中要练就绝世武功必须内外兼备,精妙的招式和深厚的内功,武功的基础是内功.对于武功低(就像江南七怪)的人,招式更重要,因为他们不能靠内功直接去伤人,只能靠招式,利刃上优势来取胜了,但是练到高手之后 ...

  9. JVM系列三:JVM参数设置

    JVM系列三:JVM参数设置.分析   不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正确的选择不同的GC策略,调整JVM.GC的参数,可以极大的减少由于GC工作,而导致的程序运 ...

随机推荐

  1. win7 64位系统 Oracle32bit + PL/SQL访问Orale服务,Oracle 11g的安装,中文乱码问题的解决

    前几天装了个Oracle32bit客户端 + PL/SQL连接不上oracle,我安装完打开PL/SQL登录界面跟正常的界面不一样,没有那个连接为Normal.SYSDBA的选项,下面有解释,至于我为 ...

  2. jstl表达式

    JSTL标签库 1.什么是JSTL JSTL是apache对EL表达式的拓展(也就是说JSTL依赖EL),JSTL是标签语言!JSTL标签使用以来非常方便, 它与JSP动作标签一样,只不过它不是JSP ...

  3. python编码问题(1)

    一.字符编码基础 字符编码是计算机对字符的格式化,从而能够在计算机系统中存储与传输. 1.ASCII码 在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态 ...

  4. 初步认识mongodb文件

    初步认识mongo. README文件介绍压缩包中各个文件的功能. bin/mongod - MongoDB server bin/mongo - MongoDB client bin/mongodu ...

  5. Maven加依赖包

    对于初学maven的人来说刚开始会有个困惑,那就是怎么知道依赖的jar的groupId和atrifactId是什么, 比如要依赖mybatis,会在pom.xml中配置如下: <dependen ...

  6. .htaccess 文件的使用

    用于服务器对文件夹的控制 官方解释为 :分布式配置文件 ,提供了针对目录改变配置的方法; 项目可以有多个这样的配置文件,子目录文件会覆盖父目录的配置 在apache(这里泛指服务器)中,/conf/v ...

  7. Apache Conf/Vost/xx.conf 文件配置

    #监听8086端口Listen 8086 NameVirtualHost *:8086#保持绝对一致 <VirtualHost *:> ServerName localhost Serve ...

  8. Android 高仿腾讯旗下app的 皮肤加载技术

    http://www.cnblogs.com/punkisnotdead/p/4968851.html 以前写的这篇文章 可以高仿出 知乎 新浪微博等 绝大多数app的换肤技术,但是遗漏了腾讯的效果, ...

  9. IClassSchemaEdit修改要素类信息

    private void ChangeFeatureClassAliasName(IFeatureClass pFeatureClass, string aliasName) { ISchemaLoc ...

  10. 【进阶——最小费用最大流】hdu 1533 Going Home (费用流)Pacific Northwest 2004

    题意: 给一个n*m的矩阵,其中由k个人和k个房子,给每个人匹配一个不同的房子,要求所有人走过的曼哈顿距离之和最短. 输入: 多组输入数据. 每组输入数据第一行是两个整型n, m,表示矩阵的长和宽. ...