首页 > 代码库 > JVM监控概述(图文)
JVM监控概述(图文)
JVM内存分配概述
Jvm 内存分为:堆、非堆及直接内存三大块。
堆区分为年轻代和老年代,永生代属于非堆内存。
对象优先在Eden区分配
大对象直接进入老年代
长期存活的对象将进入老年代
class、常量等信息jvm直接加载进持久代
Java对象首先进入Eden区,如果对象没有在被引用,会进入存活区(S0-S1顺序可变换), 还有引用对象然后进入老年代(大对象直接进入老年代)
年轻代满的时候会触发YongGC(Eden触发),只对年轻代回收
老年代满的时候会触发Full GC(old触发),会对整个堆内存进行垃圾清理(包括老年代、年轻代);Full GC大于24小时一次,比较合理
在gc的时候会停止应用(线程)
监控
1.1Jmap
Jmap –heap pid 查看堆内存的使用情况
说明:
Heap Configuration: //堆内存初始化配置
MinHeapFreeRatio = 40 //jvm堆最小空闲比率
MaxHeapFreeRatio = 70 //jvm堆最大空闲比率
MaxHeapSize = 264241152 (252.0MB) //jvm堆的最大的大小
NewSize = 1048576 (1.0MB) //jvm堆的新生代的默认大小
MaxNewSize = 4294901760 (4095.9375MB) //jvm堆新生代最大的大小
OldSize = 4194304 (4.0MB) //jvm堆老生代的大小
NewRatio = 2 //新生代和老生代的大小比率
SurvivorRatio = 8 //新生代中eden区与survivor区的大小比率
PermSize = 12582912 (12.0MB) //jvm堆的永生代的初始值大小
MaxPermSize = 67108864 (64.0MB)//jvm堆永生代的最大的大小
Heap Usage: //堆内存的分布
New Generation (Eden + 1 Survivor Space): //eden区加1个survivor区内存分布
capacity = 4980736 (4.75MB) //eden区加survivor区总容量
used = 2726552 (2.6002426147460938MB) //eden区加survivor区总使用
free = 2254184 (2.1497573852539062MB) //eden区加survivor区总空闲
54.74194978412829% used
Eden Space: //eden区内存分布
capacity = 4456448 (4.25MB) //eden区总容量
used = 2202264 (2.1002426147460938MB) //eden区已使用
free = 2254184 (2.1497573852539062MB) //eden区剩余容量
49.417473288143384% used //eden区使用比率
From Space: //这个使用的survivor区的内存分布
capacity = 524288 (0.5MB) //这个使用的survivor区总容量
used = 524288 (0.5MB) //这个使用的survivor区已使用
free = 0 (0.0MB) //这个使用的survivor区空闲
100.0% used//这个使用的survivor区使用比率
To Space: //另一个未使用的survivor区的内存分布
capacity = 524288 (0.5MB)
used = 0 (0.0MB)
free = 524288 (0.5MB)
0.0% used
tenured generation: //老生代的内存分布
capacity = 11010048 (10.5MB)
used = 4150576 (3.9582977294921875MB)
free = 6859472 (6.5417022705078125MB)
37.69807361421131% used
Perm Generation: // 永生代的内存分布
capacity = 12582912 (12.0MB)
used = 8190808 (7.811363220214844MB)
free = 4392104 (4.188636779785156MB)
65.09469350179036% used
jmap –histo pid 查看堆内存中的对象数量,大小
说明:
Num:序号
Instances : 实例个数
Bytes: 大小
Class name : 类名
Jmap -dump将内存使用详情输出到文件
文件内容:
看不懂啊,需要使用jhat命令进行分析
1.2Pmap 查看单一进程内存使用详情
从左到右依次显示为:内存地址,所占内存大小,文件权限,文件路径及名称
1.3Jhat 分析导出的堆文件
查看: html页面可查看堆中包含的所有类的信息
1.4Jps显示java进程
1.5 jprofiler
1.5.1内存视图Memory Views
JProfiler 的内存视图部分可以提供动态的内存使用状况更新视图和显示关于内存分配状况信息的视图。
所有的视图都有几个聚集层并且能够显示现有存在的对象和作为垃圾回收的对象。 ?
所有对象 显示类或在状况统计和尺码信息堆上所有对象的包。
可以标记当前值并显示差异值。 ?
记录对象 Record objects 显示类或所有已记录对象的包。
可以标记出当前值并且显示差异值。 ?
分配访问树 Allocation call tree 显示一棵请求树或者方法、类、包或对已选择类有带注释的分配信息的J2EE组件。 ?
分配热点 Allocation hot spots 显示一个列表,包括方法、类、包或分配已选类的J2EE组件。
可以标注当前值并且显示差异值。
对于每个热点都可以显示它的跟踪记录树。
1.5.2堆遍历 Heap walker
在JProfiler的堆遍历器(Heap walker)中,你可以对堆的状况进行快照并且可以通过选择步骤下寻找感兴趣的对象。
堆遍历器有五个视图: ?
类 Classes 显示所有类和它们的实例。 ?
分配 Allocations 为所有记录对象显示分配树和分配热点。 ?
引用 References 为单个对象和“显示到垃圾回收根目录的路径”提供索引图的显示功能。
还能提供合并输入视图和输出视图的功能。 ?
数据 Data 为单个对象显示实例和类数据。 ?
时间 Time 显示一个对已记录对象的解决时间的柱状图。
1.5.3 CPU 剖析CPU Views
JProfiler 提供不同的方法来记录访问树以优化性能和细节。
线程或者线程组以及线程状况可以被所有的视图选择。
所有的视图都可以聚集到方法、类、包或J2EE组件等不同层上。
CPU视图部分包括:访问树 Call tree 显示一个积累的自顶向下的树,树中包含所有在JVM中已记录的访问队列。
JDBC,JMS和JNDI服务请求都被注释在请求树中。请求树可以根据Servlet和JSP对URL的不同需要进行拆分。 ?
热点 Hot spots 显示消耗时间最多的方法的列表。对每个热点都能够显示回溯树。
该热点可以按照方法请求,JDBC,JMS和JNDI服务请求以及按照URL请求来进行计算。 ?
访问图 Call graph 显示一个从已选方法、类、包或J2EE组件开始的访问队列的图。 ?
访问栈 Call tracer 显示所有记录的函数调用的时间序列。
call tracer 是根据线程、包以及类来分组的,因此可以容易的找到感兴趣的指定区域。
可以隐藏线程、包类或者单个函数,以把大量的信息整理成容易分析事物。
该查看有利于分析涉及多个线程的用例,或者从调试器无法达到的角度来详细地分析控制流。
1.5.4 线程剖析 Thread Views
对线程剖析,JProfiler提供以下视图: ?
线程历史 Thread history 显示一个与线程活动和线程状态在一起的活动时间表。 ?
线程监控 Thread monitor 显示一个列表,包括所有的活动线程以及它们目前的活动状况。
死锁探测图表 Deadlock Detection 显示一个包含了所有在JVM里的死锁图表。 ?
目前使用的监测器 Current monitor useage 显示目前使用的监测器并且包括它们的关联线程。 ?
历史检测记录 History usage history 显示重大的等待事件和阻塞事件的历史记录。 ?
监测使用状态 Monitor usage statistics 显示分组监测,线程和监测类的统计监测数据。
1.5.5 VM 自动勘测VMtelemetry Views
观察JVM的内部状态,JProfiler提供了不同的遥感勘测视图,堆 Heap 显示一个堆的使用状况和堆尺寸大小活动时间表。 ?
记录的对象 Recorded objects 显示一张关于活动对象与数组的图表的活动时间表。 ?
垃圾回收 Garbage collector 显示一张关于垃圾回收活动的活动时间表。 ?
类 Classes 显示一个与已装载类的图表的活动时间表。
线程 Threads 显示一个与动态线程图表的活动时间表。 ?
可以分别查看heap,eden,survivors,code_cache,permanent内存 使用情况。
并且对代码或者gc策略进行调优。
1.6jinfo
输出给定 java 进程所有的配置信息。包括 java 系统属性和 jvm 命令行标记等。
-flags 打印命令行参数
-sysprops 打印系统属性
参数后可跟具体变量名称
如果不跟参数则全打印
如下:
[root@jingyang bin]# jinfo 1824
Attaching to process ID 1824, pleasewait...
Debugger attached successfully.
Client compiler detected.
JVM version is 20.45-b01
Java System Properties:
java.runtime.name = Java(TM) SE RuntimeEnvironment
sun.boot.library.path =/usr/java/jdk1.6.0_45/jre/lib/i386
java.vm.version = 20.45-b01
shared.loader =
java.vm.vendor = Sun Microsystems Inc.
java.vendor.url = http://java.sun.com/
path.separator = :
tomcat.util.buf.StringCache.byte.enabled =true
java.util.logging.config.file =/data/apps/apache-tomcat-7.0.41/conf/logging.properties
java.vm.name = Java HotSpot(TM) Client VM
file.encoding.pkg = sun.io
sun.java.launcher = SUN_STANDARD
user.country = CN
sun.os.patch.level = unknown
java.vm.specification.name = Java VirtualMachine Specification
user.dir =/data/apps/apache-tomcat-7.0.41/bin
java.runtime.version = 1.6.0_45-b06
org.apache.catalina.startup.TldConfig.jarsToSkip=
java.awt.graphicsenv =sun.awt.X11GraphicsEnvironment
java.endorsed.dirs =/data/apps/apache-tomcat-7.0.41/endorsed
os.arch = i386
java.io.tmpdir =/data/apps/apache-tomcat-7.0.41/temp
line.separator =
java.vm.specification.vendor = SunMicrosystems Inc.
java.naming.factory.url.pkgs =org.apache.naming
java.util.logging.manager =org.apache.juli.ClassLoaderLogManager
os.name = Linux
sun.jnu.encoding = UTF-8
tomcat.util.scan.DefaultJarScanner.jarsToSkip= bootstrap.jar,commons-daemon.jar,tomcat-juli.jar,annotations-api.jar,el-api.jar,jsp-api.jar,servlet-api.jar,catalina.jar,catalina-ant.jar,catalina-ha.jar,catalina-tribes.jar,jasper.jar,jasper-el.jar,ecj-*.jar,tomcat-api.jar,tomcat-util.jar,tomcat-coyote.jar,tomcat-dbcp.jar,tomcat-jni.jar,tomcat-spdy.jar,tomcat-i18n-en.jar,tomcat-i18n-es.jar,tomcat-i18n-fr.jar,tomcat-i18n-ja.jar,tomcat-juli-adapters.jar,catalina-jmx-remote.jar,catalina-ws.jar,tomcat-jdbc.jar,tools.jar,commons-beanutils*.jar,commons-codec*.jar,commons-collections*.jar,commons-dbcp*.jar,commons-digester*.jar,commons-fileupload*.jar,commons-httpclient*.jar,commons-io*.jar,commons-lang*.jar,commons-logging*.jar,commons-math*.jar,commons-pool*.jar,jstl.jar,geronimo-spec-jaxrpc*.jar,wsdl4j*.jar,ant.jar,ant-junit*.jar,aspectj*.jar,jmx.jar,h2*.jar,hibernate*.jar,httpclient*.jar,jmx-tools.jar,jta*.jar,log4j*.jar,mail*.jar,slf4j*.jar,xercesImpl.jar,xmlParserAPIs.jar,xml-apis.jar,junit.jar,junit-*.jar,ant-launcher.jar
java.library.path = /usr/java/jdk1.6.0_45/jre/lib/i386/client:/usr/java/jdk1.6.0_45/jre/lib/i386:/usr/java/jdk1.6.0_45/jre/../lib/i386:/usr/java/packages/lib/i386:/lib:/usr/lib
java.specification.name = Java Platform APISpecification
java.class.version = 50.0
sun.management.compiler = HotSpot ClientCompiler
os.version = 2.6.32-358.el6.i686
org.apache.catalina.startup.ContextConfig.jarsToSkip=
user.home = /root
catalina.useNaming = true
user.timezone = PRC
java.awt.printerjob =sun.print.PSPrinterJob
file.encoding = UTF-8
java.specification.version = 1.6
catalina.home =/data/apps/apache-tomcat-7.0.41
java.class.path =/data/apps/apache-tomcat-7.0.41/bin/bootstrap.jar:/data/apps/apache-tomcat-7.0.41/bin/tomcat-juli.jar
user.name = root
java.naming.factory.initial =org.apache.naming.java.javaURLContextFactory
package.definition =sun.,java.,org.apache.catalina.,org.apache.coyote.,org.apache.tomcat.,org.apache.jasper.
java.vm.specification.version = 1.0
sun.java.command =org.apache.catalina.startup.Bootstrap start
java.home = /usr/java/jdk1.6.0_45/jre
sun.arch.data.model = 32
user.language = zh
java.specification.vendor = SunMicrosystems Inc.
java.vm.info = mixed mode
java.version = 1.6.0_45
java.ext.dirs =/usr/java/jdk1.6.0_45/jre/lib/ext:/usr/java/packages/lib/ext
sun.boot.class.path = /usr/java/jdk1.6.0_45/jre/lib/resources.jar:/usr/java/jdk1.6.0_45/jre/lib/rt.jar:/usr/java/jdk1.6.0_45/jre/lib/sunrsasign.jar:/usr/java/jdk1.6.0_45/jre/lib/jsse.jar:/usr/java/jdk1.6.0_45/jre/lib/jce.jar:/usr/java/jdk1.6.0_45/jre/lib/charsets.jar:/usr/java/jdk1.6.0_45/jre/lib/modules/jdk.boot.jar:/usr/java/jdk1.6.0_45/jre/classes:/tmp/jag6aKikx
server.loader =
java.vendor = Sun Microsystems Inc.
catalina.base =/data/apps/apache-tomcat-7.0.41
file.separator = /
java.vendor.url.bug = http://java.sun.com/cgi-bin/bugreport.cgi
common.loader =${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar
sun.io.unicode.encoding = UnicodeLittle
sun.cpu.endian = little
package.access = sun.,org.apache.catalina.,org.apache.coyote.,org.apache.tomcat.,org.apache.jasper.
sun.cpu.isalist =
VM Flags:
-Djava.util.logging.config.file=/data/apps/apache-tomcat-7.0.41/conf/logging.properties-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -agentpath:/opt/jprofiler/bin/linux-x86/libjprofilerti.so=port=8849-Djava.endorsed.dirs=/data/apps/apache-tomcat-7.0.41/endorsed-Dcatalina.base=/data/apps/apache-tomcat-7.0.41-Dcatalina.home=/data/apps/apache-tomcat-7.0.41-Djava.io.tmpdir=/data/apps/apache-tomcat-7.0.41/temp
1.7jstat
用来监视VM内存内的各种堆和非堆的大小及其内存使用量。
参数说明:
jstat -class pid:显示加载class的数量,及所占空间等信息。
jstat -compiler pid:显示VM实时编译的数量等信息。
jstat -gc pid:可以显示gc的信息,查看gc的次数,及时间。其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。
jstat -gccapacity:可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小,如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。其他的可以根据这个类推, OC是old内纯的占用量。
jstat -gcnew pid:new对象的信息。
jstat -gcnewcapacity pid:new对象的信息及其占用量。
jstat -gcold pid:old对象的信息。
jstat -gcoldcapacity pid:old对象的信息及其占用量。
jstat -gcpermcapacity pid: perm对象的信息及其占用量。
jstat -util pid:统计gc信息统计。
jstat -printcompilation pid:当前VM执行的信息。
除了以上一个参数外,还可以同时加上 两个数字,如:jstat-printcompilation 3024 250 6是每250毫秒打印一次,一共打印6次,还可以加上-h3每三行显示一下标题。
[root@jingyang bin]# jstat -gcutil 1824 110
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 3.76 91.20 61.02 96.96 23 0.071 0 0.000 0.071
0.00 3.76 91.20 61.02 96.96 23 0.071 0 0.000 0.071
0.00 3.76 91.20 61.02 96.96 23 0.071 0 0.000 0.071
0.00 3.76 91.20 61.02 96.96 23 0.071 0 0.000 0.071
0.00 3.76 91.20 61.02 96.96 23 0.071 0 0.000 0.071
0.00 3.76 91.20 61.02 96.96 23 0.071 0 0.000 0.071
0.00 3.76 91.20 61.02 96.96 23 0.071 0 0.000 0.071
0.00 3.76 91.20 61.02 96.96 23 0.071 0 0.000 0.071
0.00 3.76 91.20 61.02 96.96 23 0.071 0 0.000 0.071
0.00 3.76 91.20 61.02 96.96 23 0.071 0 0.000 0.071
1.8jstack
为指定的线程输出 java 的线程堆栈信息,包括了进程里的所有线程。每一个线程 frame ,包括类全名,方法名,代码行。
[root@jingyang bin]# jstack 1824
2014-08-16 18:59:34
Full thread dump Java HotSpot(TM) Client VM(20.45-b01 mixed mode):
"Attach Listener" daemon prio=10tid=0x9f564400 nid=0x8b3 runnable [0x00000000]
java.lang.Thread.State: RUNNABLE
"ajp-bio-8009-AsyncTimeout" daemonprio=10 tid=0xa0556000 nid=0x736 waiting on condition [0x9f10b000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
atjava.lang.Thread.__jprofiler_nmp_sleep(Native Method)
atjava.lang.Thread.sleep(Thread.java)
atorg.apache.tomcat.util.net.JIoEndpoint$AsyncTimeout.run(JIoEndpoint.java:148)
atjava.lang.Thread.run(Thread.java:662)
"ajp-bio-8009-Acceptor-0" daemonprio=10 tid=0xa0554c00 nid=0x735 runnable [0x9f15c000]
java.lang.Thread.State: RUNNABLE
atjava.net.PlainSocketImpl.socketAccept(Native Method)
atjava.net.PlainSocketImpl.accept(PlainSocketImpl.java:408)
-locked <0xa5fffdb0> (a java.net.SocksSocketImpl)
atjava.net.ServerSocket.implAccept(ServerSocket.java:462)
atjava.net.ServerSocket.accept(ServerSocket.java:430)
atorg.apache.tomcat.util.net.DefaultServerSocketFactory.acceptSocket(DefaultServerSocketFactory.java:60)
atorg.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:216)
atjava.lang.Thread.run(Thread.java:662)
"http-bio-8082-AsyncTimeout"daemon prio=10 tid=0x9f8f2c00 nid=0x734 waiting on condition [0x9f1ad000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
atjava.lang.Thread.__jprofiler_nmp_sleep(Native Method)
atjava.lang.Thread.sleep(Thread.java)
atorg.apache.tomcat.util.net.JIoEndpoint$AsyncTimeout.run(JIoEndpoint.java:148)
atjava.lang.Thread.run(Thread.java:662)
"http-bio-8082-Acceptor-0" daemonprio=10 tid=0x9f575000 nid=0x733 runnable [0x9f1fe000]
java.lang.Thread.State: RUNNABLE
atjava.net.PlainSocketImpl.socketAccept(Native Method)
atjava.net.PlainSocketImpl.accept(PlainSocketImpl.java:408)
-locked <0xa60012b8> (a java.net.SocksSocketImpl)
atjava.net.ServerSocket.implAccept(ServerSocket.java:462)
atjava.net.ServerSocket.accept(ServerSocket.java:430)
atorg.apache.tomcat.util.net.DefaultServerSocketFactory.acceptSocket(DefaultServerSocketFactory.java:60)
atorg.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:216)
atjava.lang.Thread.run(Thread.java:662)
"ContainerBackgroundProcessor[StandardEngine[Catalina]]"daemon prio=10 tid=0x9f4d0000 nid=0x732 waiting on condition [0x9f35c000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
atjava.lang.Thread.__jprofiler_nmp_sleep(Native Method)
atjava.lang.Thread.sleep(Thread.java)
atorg.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1508)
atjava.lang.Thread.run(Thread.java:662)
"GC Daemon" daemon prio=10tid=0x9f7d9800 nid=0x72f in Object.wait() [0x9feb7000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
atjava.lang.Object.wait(Native Method)
-waiting on <0xa5f610e8> (a sun.misc.GC$LatencyLock)
atsun.misc.GC$Daemon.run(GC.java:100)
-locked <0xa5f610e8> (a sun.misc.GC$LatencyLock)
"_jprofiler_control_sampler"daemon prio=10 tid=0x9fd07c00 nid=0x72e waiting on condition [0x9fbab000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
atjava.lang.Thread.__jprofiler_nmp_sleep(Native Method)
atjava.lang.Thread.sleep(Thread.java)
atcom.jprofiler.agent.probe.f.run(ejt:1025)
"Low Memory Detector" daemonprio=10 tid=0x9fd02c00 nid=0x72c runnable [0x00000000]
java.lang.Thread.State: RUNNABLE
"C1 CompilerThread0" daemonprio=10 tid=0x9fd01000 nid=0x72b waiting on condition [0x00000000]
java.lang.Thread.State: RUNNABLE
"_jprofiler_sampler" daemonprio=10 tid=0xa05fac00 nid=0x72a waiting on condition [0x9fe66000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
atjava.lang.Thread.__jprofiler_nmp_sleep(Native Method)
atjava.lang.Thread.sleep(Thread.java)
atcom.jprofiler.agent.Sampler.run(ejt:97)
"_jprofiler_native_sampler"daemon prio=10 tid=0x08c52c00 nid=0x729 runnable [0x00000000]
java.lang.Thread.State: RUNNABLE
"_jprofiler_native_comm" daemonprio=10 tid=0xa05e9c00 nid=0x726 runnable [0x00000000]
java.lang.Thread.State: RUNNABLE
"Signal Dispatcher" daemonprio=10 tid=0xa05e8400 nid=0x725 runnable [0x00000000]
java.lang.Thread.State: RUNNABLE
"Finalizer" daemon prio=10tid=0xa052f800 nid=0x724 in Object.wait() [0xa04ad000]
java.lang.Thread.State: WAITING (on object monitor)
atjava.lang.Object.wait(Native Method)
-waiting on <0xa5dfb558> (a java.lang.ref.ReferenceQueue$Lock)
atjava.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
-locked <0xa5dfb558> (a java.lang.ref.ReferenceQueue$Lock)
atjava.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
atjava.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:171)
"Reference Handler" daemonprio=10 tid=0xa052e400 nid=0x723 in Object.wait() [0xa04fe000]
java.lang.Thread.State: WAITING (on object monitor)
atjava.lang.Object.wait(Native Method)
-waiting on <0xa5dfb5e8> (a java.lang.ref.Reference$Lock)
atjava.lang.Object.wait(Object.java:485)
atjava.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
-locked <0xa5dfb5e8> (a java.lang.ref.Reference$Lock)
"main" prio=10 tid=0xb6a4f800nid=0x721 runnable [0xb6bd9000]
java.lang.Thread.State: RUNNABLE
atjava.net.PlainSocketImpl.socketAccept(Native Method)
atjava.net.PlainSocketImpl.accept(PlainSocketImpl.java:408)
-locked <0xa6368a90> (a java.net.SocksSocketImpl)
atjava.net.ServerSocket.implAccept(ServerSocket.java:462)
atjava.net.ServerSocket.accept(ServerSocket.java:430)
atorg.apache.catalina.core.StandardServer.await(StandardServer.java:452)
atorg.apache.catalina.startup.Catalina.await(Catalina.java:766)
atorg.apache.catalina.startup.Catalina.start(Catalina.java:712)
atsun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
atsun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
atsun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
atjava.lang.reflect.Method.invoke(Method.java:597)
atorg.apache.catalina.startup.Bootstrap.start(Bootstrap.java:322)
atorg.apache.catalina.startup.Bootstrap.main(Bootstrap.java:456)
"VM Thread" prio=10tid=0xa0500c00 nid=0x722 runnable
"VM Periodic Task Thread" prio=10tid=0x9fd06800 nid=0x72d waiting on condition
JNI global references: 4191
1.9jstatd
此命令是一个RMI Server应用程序,提供了对JVM的创建和结束监视,也为远程监视工具提供了一个可以attach的接口
参数说明:
-nr 当一个存在的RMI Registry没有找到时,不尝试创建一个内部的RMI Registry
-p port 端口号,默认为1099
-n rminame 默认为JStatRemoteHost;如果多个jstatd服务开始在同一台主机上,rminame唯一确定一个jstatd服务
-J jvm选项
授权文件创建
Vi jstatd.all.policy
grant codebase"file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
启动
jstatd-J-Djava.security.policy=jstatd.all.policy &
1.10jvisualvm
运行jvisualvm 首先需要先启动jstatd
1.11jconsole
待抽时间对每一种工具进行详细解说,互相勉励、互相学习。
JVM监控概述(图文)