首页 > 代码库 > 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监控概述(图文)