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
說明: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
說明:
Num:序號
Instances : 實例個數
Bytes: 大小
Class name : 類名
文件內容:
看不懂啊,須要使用jhat命令進行分析
從左到右依次顯示爲:內存地址,所佔內存大小,文件權限,文件路徑及名稱
查看: html頁面可查看堆中包含的全部類的信息
JProfiler 的內存視圖部分能夠提供動態的內存使用情況更新視圖和顯示關於內存分配情況信息的視圖。
全部的視圖都有幾個彙集層而且可以顯示現有存在的對象和做爲垃圾回收的對象。
全部對象 顯示類或在情況統計和尺碼信息堆上全部對象的包。
能夠標記當前值並顯示差別值。
記錄對象 Record objects 顯示類或全部已記錄對象的包。
能夠標記出當前值而且顯示差別值。
分配訪問樹 Allocation call tree 顯示一棵請求樹或者方法、類、包或對已選擇類有帶註釋的分配信息的J2EE組件。
分配熱點 Allocation hot spots 顯示一個列表,包括方法、類、包或分配已選類的J2EE組件。
能夠標註當前值而且顯示差別值。
對於每一個熱點均可以顯示它的跟蹤記錄樹。
在JProfiler的堆遍歷器(Heap walker)中,你能夠對堆的情況進行快照而且能夠經過選擇步驟下尋找感興趣的對象。
堆遍歷器有五個視圖:
類 Classes 顯示全部類和它們的實例。
分配 Allocations 爲全部記錄對象顯示分配樹和分配熱點。
引用 References 爲單個對象和「顯示到垃圾回收根目錄的路徑」提供索引圖的顯示功能。
還能提供合併輸入視圖和輸出視圖的功能。
數據 Data 爲單個對象顯示實例和類數據。
時間 Time 顯示一個對已記錄對象的解決時間的柱狀圖。
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 是根據線程、包以及類來分組的,所以能夠容易的找到感興趣的指定區域。
能夠隱藏線程、包類或者單個函數,以把大量的信息整理成容易分析事物。
該查看有利於分析涉及多個線程的用例,或者從調試器沒法達到的角度來詳細地分析控制流。
對線程剖析,JProfiler提供如下視圖:
線程歷史 Thread history 顯示一個與線程活動和線程狀態在一塊兒的活動時間表。
線程監控 Thread monitor 顯示一個列表,包括全部的活動線程以及它們目前的活動情況。
死鎖探測圖表 Deadlock Detection 顯示一個包含了全部在JVM裏的死鎖圖表。
目前使用的監測器 Current monitor useage 顯示目前使用的監測器而且包括它們的關聯線程。
歷史檢測記錄 History usage history 顯示重大的等待事件和阻塞事件的歷史記錄。
監測使用狀態 Monitor usage statistics 顯示分組監測,線程和監測類的統計監測數據。
觀察JVM的內部狀態,JProfiler提供了不一樣的遙感勘測視圖,堆 Heap 顯示一個堆的使用情況和堆尺寸大小活動時間表。
記錄的對象 Recorded objects 顯示一張關於活動對象與數組的圖表的活動時間表。
垃圾回收 Garbage collector 顯示一張關於垃圾回收活動的活動時間表。
類 Classes 顯示一個與已裝載類的圖表的活動時間表。
線程 Threads 顯示一個與動態線程圖表的活動時間表。
能夠分別查看heap,eden,survivors,code_cache,permanent內存 使用狀況。
而且對代碼或者gc策略進行調優。
輸出給定 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
用來監視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
爲指定的線程輸出 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
此命令是一個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 &
運行jvisualvm 首先須要先啓動jstatd
待抽時間對每一種工具進行詳細解說,互相勉勵、互相學習。