JVM監控概述(圖文)

JVM內存分配概述html

Jvm 內存分爲:堆、非堆及直接內存三大塊。java

堆區分爲年輕代和老年代,永生代屬於非堆內存。linux

對象優先在Eden區分配apache

大對象直接進入老年代bootstrap

長期存活的對象將進入老年代api

class、常量等信息jvm直接加載進持久代數組

 

Java對象首先進入Eden區,若是對象沒有在被引用,會進入存活區(S0-S1順序可變換), 還有引用對象而後進入老年代(大對象直接進入老年代)
年輕代滿的時候會觸發YongGC(Eden觸發),只對年輕代回收
老年代滿的時候會觸發Full GC(old觸發),會對整個堆內存進行垃圾清理(包括老年代、年輕代);Full GC大於24小時一次,比較合理
在gc的時候會中止應用(線程) tomcat

 

 

監控

 

1.1Jmap

 

Jmap –heap pid    查看堆內存的使用狀況

 

 

 

 

說明:app

 

Heap Configuration:            //堆內存初始化配置jvm

   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, please wait...

Debugger attached successfully.

Client compiler detected.

JVM version is 20.45-b01

Java System Properties:

 

java.runtime.name = Java(TM) SE Runtime Environment

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 Virtual Machine 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 = Sun Microsystems 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 API Specification

java.class.version = 50.0

sun.management.compiler = HotSpot Client Compiler

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 = Sun Microsystems 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 1 10

  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=10 tid=0x9f564400 nid=0x8b3 runnable [0x00000000]

   java.lang.Thread.State: RUNNABLE

 

"ajp-bio-8009-AsyncTimeout" daemon prio=10 tid=0xa0556000 nid=0x736 waiting on condition [0x9f10b000]

   java.lang.Thread.State: TIMED_WAITING (sleeping)

         at java.lang.Thread.__jprofiler_nmp_sleep(Native Method)

         at java.lang.Thread.sleep(Thread.java)

         at org.apache.tomcat.util.net.JIoEndpoint$AsyncTimeout.run(JIoEndpoint.java:148)

         at java.lang.Thread.run(Thread.java:662)

 

"ajp-bio-8009-Acceptor-0" daemon prio=10 tid=0xa0554c00 nid=0x735 runnable [0x9f15c000]

   java.lang.Thread.State: RUNNABLE

         at java.net.PlainSocketImpl.socketAccept(Native Method)

         at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:408)

         - locked <0xa5fffdb0> (a java.net.SocksSocketImpl)

         at java.net.ServerSocket.implAccept(ServerSocket.java:462)

         at java.net.ServerSocket.accept(ServerSocket.java:430)

         at org.apache.tomcat.util.net.DefaultServerSocketFactory.acceptSocket(DefaultServerSocketFactory.java:60)

         at org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:216)

         at java.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)

         at java.lang.Thread.__jprofiler_nmp_sleep(Native Method)

         at java.lang.Thread.sleep(Thread.java)

         at org.apache.tomcat.util.net.JIoEndpoint$AsyncTimeout.run(JIoEndpoint.java:148)

         at java.lang.Thread.run(Thread.java:662)

 

"http-bio-8082-Acceptor-0" daemon prio=10 tid=0x9f575000 nid=0x733 runnable [0x9f1fe000]

   java.lang.Thread.State: RUNNABLE

         at java.net.PlainSocketImpl.socketAccept(Native Method)

         at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:408)

         - locked <0xa60012b8> (a java.net.SocksSocketImpl)

         at java.net.ServerSocket.implAccept(ServerSocket.java:462)

         at java.net.ServerSocket.accept(ServerSocket.java:430)

         at org.apache.tomcat.util.net.DefaultServerSocketFactory.acceptSocket(DefaultServerSocketFactory.java:60)

         at org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:216)

         at java.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)

         at java.lang.Thread.__jprofiler_nmp_sleep(Native Method)

         at java.lang.Thread.sleep(Thread.java)

         at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1508)

         at java.lang.Thread.run(Thread.java:662)

 

"GC Daemon" daemon prio=10 tid=0x9f7d9800 nid=0x72f in Object.wait() [0x9feb7000]

   java.lang.Thread.State: TIMED_WAITING (on object monitor)

         at java.lang.Object.wait(Native Method)

         - waiting on <0xa5f610e8> (a sun.misc.GC$LatencyLock)

         at sun.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)

         at java.lang.Thread.__jprofiler_nmp_sleep(Native Method)

         at java.lang.Thread.sleep(Thread.java)

         at com.jprofiler.agent.probe.f.run(ejt:1025)

 

"Low Memory Detector" daemon prio=10 tid=0x9fd02c00 nid=0x72c runnable [0x00000000]

   java.lang.Thread.State: RUNNABLE

 

"C1 CompilerThread0" daemon prio=10 tid=0x9fd01000 nid=0x72b waiting on condition [0x00000000]

   java.lang.Thread.State: RUNNABLE

 

"_jprofiler_sampler" daemon prio=10 tid=0xa05fac00 nid=0x72a waiting on condition [0x9fe66000]

   java.lang.Thread.State: TIMED_WAITING (sleeping)

         at java.lang.Thread.__jprofiler_nmp_sleep(Native Method)

         at java.lang.Thread.sleep(Thread.java)

         at com.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" daemon prio=10 tid=0xa05e9c00 nid=0x726 runnable [0x00000000]

   java.lang.Thread.State: RUNNABLE

 

"Signal Dispatcher" daemon prio=10 tid=0xa05e8400 nid=0x725 runnable [0x00000000]

   java.lang.Thread.State: RUNNABLE

 

"Finalizer" daemon prio=10 tid=0xa052f800 nid=0x724 in Object.wait() [0xa04ad000]

   java.lang.Thread.State: WAITING (on object monitor)

         at java.lang.Object.wait(Native Method)

         - waiting on <0xa5dfb558> (a java.lang.ref.ReferenceQueue$Lock)

         at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)

         - locked <0xa5dfb558> (a java.lang.ref.ReferenceQueue$Lock)

         at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)

         at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:171)

 

"Reference Handler" daemon prio=10 tid=0xa052e400 nid=0x723 in Object.wait() [0xa04fe000]

   java.lang.Thread.State: WAITING (on object monitor)

         at java.lang.Object.wait(Native Method)

         - waiting on <0xa5dfb5e8> (a java.lang.ref.Reference$Lock)

         at java.lang.Object.wait(Object.java:485)

         at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)

         - locked <0xa5dfb5e8> (a java.lang.ref.Reference$Lock)

 

"main" prio=10 tid=0xb6a4f800 nid=0x721 runnable [0xb6bd9000]

   java.lang.Thread.State: RUNNABLE

         at java.net.PlainSocketImpl.socketAccept(Native Method)

         at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:408)

         - locked <0xa6368a90> (a java.net.SocksSocketImpl)

         at java.net.ServerSocket.implAccept(ServerSocket.java:462)

         at java.net.ServerSocket.accept(ServerSocket.java:430)

         at org.apache.catalina.core.StandardServer.await(StandardServer.java:452)

         at org.apache.catalina.startup.Catalina.await(Catalina.java:766)

         at org.apache.catalina.startup.Catalina.start(Catalina.java:712)

         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

         at java.lang.reflect.Method.invoke(Method.java:597)

         at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:322)

         at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:456)

 

"VM Thread" prio=10 tid=0xa0500c00 nid=0x722 runnable

 

"VM Periodic Task Thread" prio=10 tid=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

 

 

 待抽時間對每一種工具進行詳細解說,互相勉勵、互相學習。

相關文章
相關標籤/搜索