您的位置:首页 > 其它

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

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

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

内存使用情况--heap&PermGen

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

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

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

描述最大值当前值报警值
堆内存@HeapConfiguration::MaxHeapSize
sum(eden+servivor+old)
sum(eden+servivor+old)自设
非堆内存sum(perm+native)
Eden@EdenSpace::capacity@EdenSpace::used
Survivor0@FromSpace::capacity@FromSpace::used
Survivor1@ToSpace::capacity@ToSpace::used
Newgen
(注意区别于Xmn参数设置)
@NewGeneration::capacity
Eden+1SurvivorSpace
@NewGeneration::used
Oldgen@concurrentmark-sweepgeneration::capacity
(CMS是对old区的gc,所以此处即表示oldgen)
@concurrentmark-sweepgeneration::capacity(CMS)::used自设
PermGen@PermGeneration::capacity@PermGeneration::used自设
内存使用情况--config

描述配置值
MaxTenuringThresholdjinfo-flagMaxTenuringThresholdpid
MinHeapFreeRatio@HeapConfiguration::MinHeapFreeRatio
MaxHeapFreeRatio@HeapConfiguration::MaxHeapFreeRatio
newgengc@using…inthenewgeneration
oldgengcnewgengc声明下方
类总数统计??
内存使用情况—Cheap

toporpsaux

谁使用了内存

Heap
jmap–histo
jmap–dump,thenmat

Cheap
googleperftools

GC的状况

描述收集次数收集时间应用暂停时间
FullGC#FGC#FGCT设置-XX:+PrintGCApplicationStoppedTime后在日志中查看
YoungGC#YGC#YGCT同上
-XX:+PrintGCDetails-XX:+PrintGCTimeStamps-XX:+PrintHeapAtGC-XX:+PrintGCApplicationStoppedTime-Xloggc:logs/gc.log

常用工具介绍:jinfojmapjstackjstat

jinfo

可以从一个给定的java进程或core文件或远程debug服务器上获取java配置信息。包括java系统属性及JVM参数(commandlineflags)。注意在jvm启动参数中没有配置的参数也可使用jinfo–flagxxxpid输出默认值(很有用,但貌似一些简写的参数查不出来)。

可以修改运行时的java进程的opts。

只有solaris和linux的JDK版本里有。

使用方式可使用jinfo–h查询。

jmap

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

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

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

举例:

jmap-heappid

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

dump文件可以通过MemoryAnalyzer分析查看.网址:http://www.eclipse.org/mat/,可以查看dump时对象数量,内存占用,线程情况等。
jmap-dump:live为啥会触发FullGC
jstack

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

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

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

举例:

jstackpid

jstat

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

举例:

jstat–printcompilation-h103024250600


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

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

[/code]
参数介绍:

-hn每隔几行输出标题

vmidVM的进程号,即当前运行的java进程号

-t在第一列显示自JVM启动以来的时间戳

-J修改java进程的参数。类似jinfo-flag<name>=<value>。例如-J-Xms48m设置初始堆为48M。详见这里。这个参数挺有用的,可以在运行中调整参数以方便测试、监测。

-optionoption为要检测的参数。参数列表可通过jstat–options获取。下面将分别介绍每个参数及输出字段的含义。

class统计classloader行为信息
compiler统计编译行为信息
gc统计jdkgc时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统计编译行为信息
-classoption:ClassLoaderStatistics

ColumnDescription
LoadedNumberofclassesloaded.
BytesNumberofKbytesloaded.
UnloadedNumberofclassesunloaded.
BytesNumberofKbytesunloaded.
TimeTimespentperformingclassloadandunloadoperations.
-compiler:HotSpotJust-In-TimeCompilerStatistics

ColumnDescription
CompiledNumberofcompilationtasksperformed.
FailedNumberofcompilationtasksthatfailed.
InvalidNumberofcompilationtasksthatwereinvalidated.
TimeTimespentperformingcompilationtasks.
FailedTypeCompiletypeofthelastfailedcompilation.
FailedMethodClassnameandmethodforthelastfailedcompilation.
-gcOption:Garbage-collectedheapstatistics

ColumnDescription
S0CCurrentsurvivorspace0capacity(KB).
S1CCurrentsurvivorspace1capacity(KB).
S0USurvivorspace0utilization(KB).
S1USurvivorspace1utilization(KB).
ECCurrentedenspacecapacity(KB).
EUEdenspaceutilization(KB).
OCCurrentoldspacecapacity(KB).
OUOldspaceutilization(KB).
PCCurrentpermanentspacecapacity(KB).
PUPermanentspaceutilization(KB).
YGCNumberofyounggenerationGCEvents.
YGCTYounggenerationgarbagecollectiontime.
FGCNumberoffullGCevents.
FGCTFullgarbagecollectiontime.
GCTTotalgarbagecollectiontime.
-gccapacityOption:MemoryPoolGenerationandSpaceCapacities

ColumnDescription
NGCMNMinimumnewgenerationcapacity(KB).
NGCMXMaximumnewgenerationcapacity(KB).
NGCCurrentnewgenerationcapacity(KB).
S0CCurrentsurvivorspace0capacity(KB).
S1CCurrentsurvivorspace1capacity(KB).
ECCurrentedenspacecapacity(KB).
OGCMNMinimumoldgenerationcapacity(KB).
OGCMXMaximumoldgenerationcapacity(KB).
OGCCurrentoldgenerationcapacity(KB).
OCCurrentoldspacecapacity(KB).
PGCMNMinimumpermanentgenerationcapacity(KB).
PGCMXMaximumPermanentgenerationcapacity(KB).
PGCCurrentPermanentgenerationcapacity(KB).
PCCurrentPermanentspacecapacity(KB).
YGCNumberofYounggenerationGCEvents.
FGCNumberofFullGCEvents.
-gccauseOption:GarbageCollectionStatistics,IncludingGCEvents

ColumnDescription
LGCCCauseoflastGarbageCollection.
GCCCauseofcurrentGarbageCollection.
前面的字段与gcutil相同.

-gcnewOption:NewGenerationStatistics

ColumnDescription
S0CCurrentsurvivorspace0capacity(KB).
S1CCurrentsurvivorspace1capacity(KB).
S0USurvivorspace0utilization(KB).
S1USurvivorspace1utilization(KB).
TTTenuringthreshold.
MTTMaximumtenuringthreshold.
DSSDesiredsurvivorsize(KB).
ECCurrentedenspacecapacity(KB).
EUEdenspaceutilization(KB).
YGCNumberofyounggenerationGCevents.
YGCTYounggenerationgarbagecollectiontime.
-gcnewcapacityOption:NewGenerationSpaceSizeStatistics

ColumnDescription
NGCMNMinimumnewgenerationcapacity(KB).
NGCMXMaximumnewgenerationcapacity(KB).
NGCCurrentnewgenerationcapacity(KB).
S0CMXMaximumsurvivorspace0capacity(KB).
S0CCurrentsurvivorspace0capacity(KB).
S1CMXMaximumsurvivorspace1capacity(KB).
S1CCurrentsurvivorspace1capacity(KB).
ECMXMaximumedenspacecapacity(KB).
ECCurrentedenspacecapacity(KB).
YGCNumberofyounggenerationGCevents.
FGCNumberofFullGCEvents.
-gcoldOption:OldandPermanentGenerationStatistics

ColumnDescription
PCCurrentpermanentspacecapacity(KB).
PUPermanentspaceutilization(KB).
OCCurrentoldspacecapacity(KB).
OUoldspaceutilization(KB).
YGCNumberofyounggenerationGCevents.
FGCNumberoffullGCevents.
FGCTFullgarbagecollectiontime.
GCTTotalgarbagecollectiontime.
-gcoldcapacityOption:OldGenerationStatistics

ColumnDescription
OGCMNMinimumoldgenerationcapacity(KB).
OGCMXMaximumoldgenerationcapacity(KB).
OGCCurrentoldgenerationcapacity(KB).
OCCurrentoldspacecapacity(KB).
YGCNumberofyounggenerationGCevents.
FGCNumberoffullGCevents.
FGCTFullgarbagecollectiontime.
GCTTotalgarbagecollectiontime.
-gcpermcapacityOption:PermanentGenerationStatistics

ColumnDescription
PGCMNMinimumpermanentgenerationcapacity(KB).
PGCMXMaximumpermanentgenerationcapacity(KB).
PGCCurrentpermanentgenerationcapacity(KB).
PCCurrentpermanentspacecapacity(KB).
YGCNumberofyounggenerationGCevents.
FGCNumberoffullGCevents.
FGCTFullgarbagecollectiontime.
GCTTotalgarbagecollectiontime.
-gcutilOption:SummaryofGarbageCollectionStatistics

ColumnDescription
S0Survivorspace0utilizationasapercentageofthespace'scurrentcapacity.
S1Survivorspace1utilizationasapercentageofthespace'scurrentcapacity.
EEdenspaceutilizationasapercentageofthespace'scurrentcapacity.
OOldspaceutilizationasapercentageofthespace'scurrentcapacity.
PPermanentspaceutilizationasapercentageofthespace'scurrentcapacity.
YGCNumberofyounggenerationGCevents.
YGCTYounggenerationgarbagecollectiontime.
FGCNumberoffullGCevents.
FGCTFullgarbagecollectiontime.
GCTTotalgarbagecollectiontime.
-printcompilationOption:HotSpotCompilerMethodStatistics

ColumnDescription
CompiledNumberofcompilationtasksperformed.
SizeNumberofbytesofbytecodeforthemethod.
TypeCompilationtype.
MethodClassnameandmethodnameidentifyingthecompiledmethod.Classnameuses"/"insteadof"."asnamespaceseparator.Methodnameisthemethodwithinthegivenclass.TheformatforthesetwofieldsisconsistentwiththeHotSpot-XX:+PrintComplationoption.
Javaapi方式监测

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

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

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

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

[code]publicclassClassLoaderChecker{
publicstaticvoidmain(String[]args)throwsException{
ClassLoadingMXBeanbean=ManagementFactory.getClassLoadingMXBean();
System.out.println(bean.getLoadedClassCount());
}
}

demo2:自定义MbeanType,记录的数据可通过jconsole等工具或自写代码查看,[/code]

//工具方法

publicstaticObjectNameregister(Stringname,Objectmbean){
try{
ObjectNameobjectName=newObjectName(name);

MBeanServermbeanServer=ManagementFactory
.getPlatformMBeanServer();

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

returnobjectName;
}catch(JMExceptione){
thrownewIllegalArgumentException(name,e);
}
}

//步骤一:定义Mbean接口:
//随便定义
publicinterfaceDemoMBean{
publicAtomicLonggetInvokeCount();
}
//步骤二:实现接口,并注册:
publicclassDemoImplimplementsDemoMBean{
publicfinalstaticStringDEFAULT_OBJECT_NAME_PREFIX="com.redcreen.demo:type=demo";
register("com.redcreen.demo:type=demo",DemoImpl.instance);
}
//可以通过jconsole中查看数据了


相关推荐文章:

在JavaSE6中监视和诊断性能问题

参考:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: