摘要:打印等待回收對(duì)象的信息可以看到當(dāng)前隊(duì)列中并沒(méi)有等待線程執(zhí)行方法的對(duì)象。一般情況,會(huì)到客戶端用工具來(lái)分析用于生成虛擬機(jī)當(dāng)前時(shí)刻的線程快照。
運(yùn)用jvm自帶的命令可以方便的在生產(chǎn)監(jiān)控和打印堆棧的日志信息幫忙我們來(lái)定位問(wèn)題!雖然jvm調(diào)優(yōu)成熟的工具已經(jīng)有很多:jconsole、大名鼎鼎的VisualVM,IBM的Memory Analyzer等等,但是在生產(chǎn)環(huán)境出現(xiàn)問(wèn)題的時(shí)候,一方面工具的使用會(huì)有所限制,另一方面喜歡裝X的我們,總喜歡在出現(xiàn)問(wèn)題的時(shí)候在終端輸入一些命令來(lái)解決。所有的工具幾乎都是依賴于jdk的接口和底層的這些命令,研究這些命令的使用也讓我們更能了解jvm構(gòu)成和特性。
Sun JDK監(jiān)控和故障處理命令有jps jstat jmap jhat jstack jinfo下面做一一介紹
jpsJVM Process Status Tool,顯示指定系統(tǒng)內(nèi)所有的HotSpot虛擬機(jī)進(jìn)程。
命令格式jps [options] [hostid]option參數(shù)
-l : 輸出主類全名或jar路徑
-q : 只輸出LVMID
-m : 輸出JVM啟動(dòng)時(shí)傳遞給main()的參數(shù)
-v : 輸出JVM啟動(dòng)時(shí)顯示指定的JVM參數(shù)
其中[option]、[hostid]參數(shù)也可以不寫。
示例$ jps -l -m 28920 org.apache.catalina.startup.Bootstrap start 11589 org.apache.catalina.startup.Bootstrap start 25816 sun.tools.jps.Jps -l -mjstat
jstat(JVM statistics Monitoring)是用于監(jiān)視虛擬機(jī)運(yùn)行時(shí)狀態(tài)信息的命令,它可以顯示出虛擬機(jī)進(jìn)程中的類裝載、內(nèi)存、垃圾收集、JIT編譯等運(yùn)行數(shù)據(jù)。
命令格式jstat [option] LVMID [interval] [count]參數(shù)
option 參數(shù)總覽[option] : 操作參數(shù)
LVMID : 本地虛擬機(jī)進(jìn)程ID
[interval] : 連續(xù)輸出的時(shí)間間隔
[count] : 連續(xù)輸出的次數(shù)
Option | Displays… |
---|---|
class | class loader的行為統(tǒng)計(jì)。Statistics on the behavior of the class loader. |
compiler | HotSpt JIT編譯器行為統(tǒng)計(jì)。Statistics of the behavior of the HotSpot Just-in-Time compiler. |
gc | 垃圾回收堆的行為統(tǒng)計(jì)。Statistics of the behavior of the garbage collected heap. |
gccapacity | 各個(gè)垃圾回收代容量(young,old,perm)和他們相應(yīng)的空間統(tǒng)計(jì)。Statistics of the capacities of the generations and their corresponding spaces. |
gcutil | 垃圾回收統(tǒng)計(jì)概述。Summary of garbage collection statistics. |
gccause | 垃圾收集統(tǒng)計(jì)概述(同-gcutil),附加最近兩次垃圾回收事件的原因。Summary of garbage collection statistics (same as -gcutil), with the cause of the last and |
gcnew | 新生代行為統(tǒng)計(jì)。Statistics of the behavior of the new generation. |
gcnewcapacity | 新生代與其相應(yīng)的內(nèi)存空間的統(tǒng)計(jì)。Statistics of the sizes of the new generations and its corresponding spaces. |
gcold | 年老代和永生代行為統(tǒng)計(jì)。Statistics of the behavior of the old and permanent generations. |
gcoldcapacity | 年老代行為統(tǒng)計(jì)。Statistics of the sizes of the old generation. |
gcpermcapacity | 永生代行為統(tǒng)計(jì)。Statistics of the sizes of the permanent generation. |
printcompilation | HotSpot編譯方法統(tǒng)計(jì)。HotSpot compilation method statistics. |
監(jiān)視類裝載、卸載數(shù)量、總空間以及耗費(fèi)的時(shí)間
$ jstat -class 11589 Loaded Bytes Unloaded Bytes Time 7035 14506.3 0 0.0 3.67
Loaded : 加載class的數(shù)量
Bytes : class字節(jié)大小
Unloaded : 未加載class的數(shù)量
Bytes : 未加載class的字節(jié)大小
Time : 加載時(shí)間
輸出JIT編譯過(guò)的方法數(shù)量耗時(shí)等
$ jstat -compiler 1262 Compiled Failed Invalid Time FailedType FailedMethod 2573 1 0 47.60 1 org/apache/catalina/loader/WebappClassLoader findResourceInternal
Compiled : 編譯數(shù)量
Failed : 編譯失敗數(shù)量
Invalid : 無(wú)效數(shù)量
Time : 編譯耗時(shí)
FailedType : 失敗類型
FailedMethod : 失敗方法的全限定名
垃圾回收堆的行為統(tǒng)計(jì),常用命令
$ jstat -gc 1262 S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT 26112.0 24064.0 6562.5 0.0 564224.0 76274.5 434176.0 388518.3 524288.0 42724.7 320 6.417 1 0.398 6.815
C即Capacity 總?cè)萘浚琔即Used 已使用的容量
S0C : survivor0區(qū)的總?cè)萘?/p>
S1C : survivor1區(qū)的總?cè)萘?/p>
S0U : survivor0區(qū)已使用的容量
S1C : survivor1區(qū)已使用的容量
EC : Eden區(qū)的總?cè)萘?/p>
EU : Eden區(qū)已使用的容量
OC : Old區(qū)的總?cè)萘?/p>
OU : Old區(qū)已使用的容量
PC 當(dāng)前perm的容量 (KB)
PU perm的使用 (KB)
YGC : 新生代垃圾回收次數(shù)
YGCT : 新生代垃圾回收時(shí)間
FGC : 老年代垃圾回收次數(shù)
FGCT : 老年代垃圾回收時(shí)間
GCT : 垃圾回收總消耗時(shí)間
$ jstat -gc 1262 2000 20
這個(gè)命令意思就是每隔2000ms輸出1262的gc情況,一共輸出20次
同-gc,不過(guò)還會(huì)輸出Java堆各區(qū)域使用到的最大、最小空間
$ jstat -gccapacity 1262 NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC PGCMN PGCMX PGC PC YGC FGC 614400.0 614400.0 614400.0 26112.0 24064.0 564224.0 434176.0 434176.0 434176.0 434176.0 524288.0 1048576.0 524288.0 524288.0 320 1
NGCMN : 新生代占用的最小空間
NGCMX : 新生代占用的最大空間
OGCMN : 老年代占用的最小空間
OGCMX : 老年代占用的最大空間
OGC:當(dāng)前年老代的容量 (KB)
OC:當(dāng)前年老代的空間 (KB)
PGCMN : perm占用的最小空間
PGCMX : perm占用的最大空間
同-gc,不過(guò)輸出的是已使用空間占總空間的百分比
$ jstat -gcutil 28920 S0 S1 E O P YGC YGCT FGC FGCT GCT 12.45 0.00 33.85 0.00 4.44 4 0.242 0 0.000 0.242
垃圾收集統(tǒng)計(jì)概述(同-gcutil),附加最近兩次垃圾回收事件的原因
$ jstat -gccause 28920 S0 S1 E O P YGC YGCT FGC FGCT GCT LGCC GCC 12.45 0.00 33.85 0.00 4.44 4 0.242 0 0.000 0.242 Allocation Failure No GC
LGCC:最近垃圾回收的原因
GCC:當(dāng)前垃圾回收的原因
統(tǒng)計(jì)新生代的行為
$ jstat -gcnew 28920 S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT 419392.0 419392.0 52231.8 0.0 6 6 209696.0 3355520.0 1172246.0 4 0.242
TT:Tenuring threshold(提升閾值)
MTT:最大的tenuring threshold
DSS:survivor區(qū)域大小 (KB)
新生代與其相應(yīng)的內(nèi)存空間的統(tǒng)計(jì)
$ jstat -gcnewcapacity 28920 NGCMN NGCMX NGC S0CMX S0C S1CMX S1C ECMX EC YGC FGC 4194304.0 4194304.0 4194304.0 419392.0 419392.0 419392.0 419392.0 3355520.0 3355520.0 4 0
NGC:當(dāng)前年輕代的容量 (KB)
S0CMX:最大的S0空間 (KB)
S0C:當(dāng)前S0空間 (KB)
ECMX:最大eden空間 (KB)
EC:當(dāng)前eden空間 (KB)
統(tǒng)計(jì)舊生代的行為
$ jstat -gcold 28920 PC PU OC OU YGC FGC FGCT GCT 1048576.0 46561.7 6291456.0 0.0 4 0 0.000 0.242
統(tǒng)計(jì)舊生代的大小和空間
$ jstat -gcoldcapacity 28920 OGCMN OGCMX OGC OC YGC FGC FGCT GCT 6291456.0 6291456.0 6291456.0 6291456.0 4 0 0.000 0.242
永生代行為統(tǒng)計(jì)
$ jstat -gcpermcapacity 28920 PGCMN PGCMX PGC PC YGC FGC FGCT GCT 1048576.0 2097152.0 1048576.0 1048576.0 4 0 0.000 0.242
hotspot編譯方法統(tǒng)計(jì)
$ jstat -printcompilation 28920 Compiled Size Type Method 1291 78 1 java/util/ArrayList indexOf
jmapCompiled:被執(zhí)行的編譯任務(wù)的數(shù)量
Size:方法字節(jié)碼的字節(jié)數(shù)
Type:編譯類型
Method:編譯方法的類名和方法名。類名使用"/" 代替 "." 作為空間分隔符. 方法名是給出類的方法名. 格式是一致于HotSpot - XX:+PrintComplation 選項(xiàng)
jmap(JVM Memory Map)命令用于生成heap dump文件,如果不使用這個(gè)命令,還闊以使用-XX:+HeapDumpOnOutOfMemoryError參數(shù)來(lái)讓虛擬機(jī)出現(xiàn)OOM的時(shí)候·自動(dòng)生成dump文件。
jmap不僅能生成dump文件,還闊以查詢finalize執(zhí)行隊(duì)列、Java堆和永久代的詳細(xì)信息,如當(dāng)前使用率、當(dāng)前使用的是哪種收集器等。
jmap [option] LVMIDoption參數(shù)
示例dump : 生成堆轉(zhuǎn)儲(chǔ)快照
finalizerinfo : 顯示在F-Queue隊(duì)列等待Finalizer線程執(zhí)行finalizer方法的對(duì)象
heap : 顯示Java堆詳細(xì)信息
histo : 顯示堆中對(duì)象的統(tǒng)計(jì)信息
permstat : to print permanent generation statistics
F : 當(dāng)-dump沒(méi)有響應(yīng)時(shí),強(qiáng)制生成dump快照
常用格式
-dump::live,format=b,file=pid
dump堆到文件,format指定輸出格式,live指明是活著的對(duì)象,file指定文件名
$ jmap -dump:live,format=b,file=dump.hprof 28920 Dumping heap to /home/xxx/dump.hprof ... Heap dump file created
dump.hprof這個(gè)后綴是為了后續(xù)可以直接用MAT(Memory Anlysis Tool)打開。
打印等待回收對(duì)象的信息
$ jmap -finalizerinfo 28920 Attaching to process ID 28920, please wait... Debugger attached successfully. Server compiler detected. JVM version is 24.71-b01 Number of objects pending for finalization: 0
可以看到當(dāng)前F-QUEUE隊(duì)列中并沒(méi)有等待Finalizer線程執(zhí)行finalizer方法的對(duì)象。
打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情況,可以用此來(lái)判斷內(nèi)存目前的使用情況以及垃圾回收情況
$ jmap -heap 28920 Attaching to process ID 28920, please wait... Debugger attached successfully. Server compiler detected. JVM version is 24.71-b01 using thread-local object allocation. Parallel GC with 4 thread(s)//GC 方式 Heap Configuration: //堆內(nèi)存初始化配置 MinHeapFreeRatio = 0 //對(duì)應(yīng)jvm啟動(dòng)參數(shù)-XX:MinHeapFreeRatio設(shè)置JVM堆最小空閑比率(default 40) MaxHeapFreeRatio = 100 //對(duì)應(yīng)jvm啟動(dòng)參數(shù) -XX:MaxHeapFreeRatio設(shè)置JVM堆最大空閑比率(default 70) MaxHeapSize = 2082471936 (1986.0MB) //對(duì)應(yīng)jvm啟動(dòng)參數(shù)-XX:MaxHeapSize=設(shè)置JVM堆的最大大小 NewSize = 1310720 (1.25MB)//對(duì)應(yīng)jvm啟動(dòng)參數(shù)-XX:NewSize=設(shè)置JVM堆的‘新生代’的默認(rèn)大小 MaxNewSize = 17592186044415 MB//對(duì)應(yīng)jvm啟動(dòng)參數(shù)-XX:MaxNewSize=設(shè)置JVM堆的‘新生代’的最大大小 OldSize = 5439488 (5.1875MB)//對(duì)應(yīng)jvm啟動(dòng)參數(shù)-XX:OldSize=:設(shè)置JVM堆的‘老生代’的大小 NewRatio = 2 //對(duì)應(yīng)jvm啟動(dòng)參數(shù)-XX:NewRatio=:‘新生代’和‘老生代’的大小比率 SurvivorRatio = 8 //對(duì)應(yīng)jvm啟動(dòng)參數(shù)-XX:SurvivorRatio=設(shè)置年輕代中Eden區(qū)與Survivor區(qū)的大小比值 PermSize = 21757952 (20.75MB) //對(duì)應(yīng)jvm啟動(dòng)參數(shù)-XX:PermSize= :設(shè)置JVM堆的‘永生代’的初始大小 MaxPermSize = 85983232 (82.0MB)//對(duì)應(yīng)jvm啟動(dòng)參數(shù)-XX:MaxPermSize= :設(shè)置JVM堆的‘永生代’的最大大小 G1HeapRegionSize = 0 (0.0MB) Heap Usage://堆內(nèi)存使用情況 PS Young Generation Eden Space://Eden區(qū)內(nèi)存分布 capacity = 33030144 (31.5MB)//Eden區(qū)總?cè)萘? used = 1524040 (1.4534378051757812MB) //Eden區(qū)已使用 free = 31506104 (30.04656219482422MB) //Eden區(qū)剩余容量 4.614088270399305% used //Eden區(qū)使用比率 From Space: //其中一個(gè)Survivor區(qū)的內(nèi)存分布 capacity = 5242880 (5.0MB) used = 0 (0.0MB) free = 5242880 (5.0MB) 0.0% used To Space: //另一個(gè)Survivor區(qū)的內(nèi)存分布 capacity = 5242880 (5.0MB) used = 0 (0.0MB) free = 5242880 (5.0MB) 0.0% used PS Old Generation //當(dāng)前的Old區(qū)內(nèi)存分布 capacity = 86507520 (82.5MB) used = 0 (0.0MB) free = 86507520 (82.5MB) 0.0% used PS Perm Generation//當(dāng)前的 “永生代” 內(nèi)存分布 capacity = 22020096 (21.0MB) used = 2496528 (2.3808746337890625MB) free = 19523568 (18.619125366210938MB) 11.337498256138392% used 670 interned Strings occupying 43720 bytes.
可以很清楚的看到Java堆中各個(gè)區(qū)域目前的情況。
打印堆的對(duì)象統(tǒng)計(jì),包括對(duì)象數(shù)、內(nèi)存大小等等 (因?yàn)樵赿ump:live前會(huì)進(jìn)行full gc,如果帶上live則只統(tǒng)計(jì)活對(duì)象,因此不加live的堆大小要大于加live堆的大小 )
$ jmap -histo:live 28920 | more num #instances #bytes class name ---------------------------------------------- 1: 83613 120122482: 23868 11450280 [B 3: 83613 10716064 4: 76287 10412128 [C 5: 8227 9021176 6: 8227 5830256 7: 7031 5156480 8: 73627 1767048 java.lang.String 9: 2260 1348848 10: 8856 849296 java.lang.Class ....
僅僅打印了前10行
xml class name是對(duì)象類型,說(shuō)明如下:
B byte C char D double F float I int J long Z boolean [ 數(shù)組,如[I表示int[] [L+類名 其他對(duì)象
打印Java堆內(nèi)存的永久保存區(qū)域的類加載器的智能統(tǒng)計(jì)信息。對(duì)于每個(gè)類加載器而言,它的名稱、活躍度、地址、父類加載器、它所加載的類的數(shù)量和大小都會(huì)被打印。此外,包含的字符串?dāng)?shù)量和大小也會(huì)被打印。
$ jmap -permstat 28920 Attaching to process ID 28920, please wait... Debugger attached successfully. Server compiler detected. JVM version is 24.71-b01 finding class loader instances ..done. computing per loader stat ..done. please wait.. computing liveness.liveness analysis may be inaccurate ... class_loader classes bytes parent_loader alive? type3111 18154296 null live 0x0000000600905cf8 1 1888 0x0000000600087f08 dead sun/reflect/DelegatingClassLoader@0x00000007800500a0 0x00000006008fcb48 1 1888 0x0000000600087f08 dead sun/reflect/DelegatingClassLoader@0x00000007800500a0 0x00000006016db798 0 0 0x00000006008d3fc0 dead java/util/ResourceBundle$RBClassLoader@0x0000000780626ec0 0x00000006008d6810 1 3056 null dead sun/reflect/DelegatingClassLoader@0x00000007800500a0
強(qiáng)制模式。如果指定的pid沒(méi)有響應(yīng),請(qǐng)使用jmap -dump或jmap -histo選項(xiàng)。此模式下,不支持live子選項(xiàng)。
jhatjhat(JVM Heap Analysis Tool)命令是與jmap搭配使用,用來(lái)分析jmap生成的dump,jhat內(nèi)置了一個(gè)微型的HTTP/HTML服務(wù)器,生成dump的分析結(jié)果后,可以在瀏覽器中查看。在此要注意,一般不會(huì)直接在服務(wù)器上進(jìn)行分析,因?yàn)閖hat是一個(gè)耗時(shí)并且耗費(fèi)硬件資源的過(guò)程,一般把服務(wù)器生成的dump文件復(fù)制到本地或其他機(jī)器上進(jìn)行分析。
命令格式jhat [dumpfile]參數(shù)
示例-stack false|true
關(guān)閉對(duì)象分配調(diào)用棧跟蹤(tracking object allocation call stack)。 如果分配位置信息在堆轉(zhuǎn)儲(chǔ)中不可用. 則必須將此標(biāo)志設(shè)置為 false. 默認(rèn)值為 true.>-refs false|true
關(guān)閉對(duì)象引用跟蹤(tracking of references to objects)。 默認(rèn)值為 true. 默認(rèn)情況下, 返回的指針是指向其他特定對(duì)象的對(duì)象,如反向鏈接或輸入引用(referrers or incoming references), 會(huì)統(tǒng)計(jì)/計(jì)算堆中的所有對(duì)象。>-port port-number
設(shè)置 jhat HTTP server 的端口號(hào). 默認(rèn)值 7000.>-exclude exclude-file
指定對(duì)象查詢時(shí)需要排除的數(shù)據(jù)成員列表文件(a file that lists data members that should be excluded from the reachable objects query)。 例如, 如果文件列列出了 java.lang.String.value , 那么當(dāng)從某個(gè)特定對(duì)象 Object o 計(jì)算可達(dá)的對(duì)象列表時(shí), 引用路徑涉及 java.lang.String.value 的都會(huì)被排除。>-baseline exclude-file
指定一個(gè)基準(zhǔn)堆轉(zhuǎn)儲(chǔ)(baseline heap dump)。 在兩個(gè) heap dumps 中有相同 object ID 的對(duì)象會(huì)被標(biāo)記為不是新的(marked as not being new). 其他對(duì)象被標(biāo)記為新的(new). 在比較兩個(gè)不同的堆轉(zhuǎn)儲(chǔ)時(shí)很有用.>-debug int
設(shè)置 debug 級(jí)別. 0 表示不輸出調(diào)試信息。 值越大則表示輸出更詳細(xì)的 debug 信息.>-version
啟動(dòng)后只顯示版本信息就退出>-J< flag >
因?yàn)?jhat 命令實(shí)際上會(huì)啟動(dòng)一個(gè)JVM來(lái)執(zhí)行, 通過(guò) -J 可以在啟動(dòng)JVM時(shí)傳入一些啟動(dòng)參數(shù). 例如, -J-Xmx512m 則指定運(yùn)行 jhat 的Java虛擬機(jī)使用的最大堆內(nèi)存為 512 MB. 如果需要使用多個(gè)JVM啟動(dòng)參數(shù),則傳入多個(gè) -Jxxxxxx.
$ jhat -J-Xmx512m dump.hprof eading from dump.hprof... Dump file created Fri Mar 11 17:13:42 CST 2016 Snapshot read, resolving... Resolving 271678 objects... Chasing references, expect 54 dots...................................................... Eliminating duplicate references...................................................... Snapshot resolved. Started HTTP server on port 7000 Server is ready.
中間的-J-Xmx512m是在dump快照很大的情況下分配512M內(nèi)存去啟動(dòng)HTTP服務(wù)器,運(yùn)行完之后就可在瀏覽器打開Http://localhost:7000進(jìn)行快照分析
堆快照分析主要在最后面的Heap Histogram里,里面根據(jù)class列出了dump的時(shí)候所有存活對(duì)象。
分析同樣一個(gè)dump快照,MAT需要的額外內(nèi)存比jhat要小的多的多,所以建議使用MAT來(lái)進(jìn)行分析,當(dāng)然也看個(gè)人偏好。
分析打開瀏覽器Http://localhost:7000,該頁(yè)面提供了幾個(gè)查詢功能可供使用:
All classes including platform Show all members of the rootset Show instance counts for all classes (including platform) Show instance counts for all classes (excluding platform) Show heap histogram Show finalizer summary Execute Object Query Language (OQL) query
一般查看堆異常情況主要看這個(gè)兩個(gè)部分:
Show instance counts for all classes (excluding platform),平臺(tái)外的所有對(duì)象信息。如下圖:
Show heap histogram 以樹狀圖形式展示堆情況。如下圖:
具體排查時(shí)需要結(jié)合代碼,觀察是否大量應(yīng)該被回收的對(duì)象在一直被引用或者是否有占用內(nèi)存特別大的對(duì)象無(wú)法被回收。
一般情況,會(huì)down到客戶端用工具來(lái)分析
jstack用于生成java虛擬機(jī)當(dāng)前時(shí)刻的線程快照。線程快照是當(dāng)前java虛擬機(jī)內(nèi)每一條線程正在執(zhí)行的方法堆棧的集合,生成線程快照的主要目的是定位線程出現(xiàn)長(zhǎng)時(shí)間停頓的原因,如線程間死鎖、死循環(huán)、請(qǐng)求外部資源導(dǎo)致的長(zhǎng)時(shí)間等待等。 線程出現(xiàn)停頓的時(shí)候通過(guò)jstack來(lái)查看各個(gè)線程的調(diào)用堆棧,就可以知道沒(méi)有響應(yīng)的線程到底在后臺(tái)做什么事情,或者等待什么資源。 如果java程序崩潰生成core文件,jstack工具可以用來(lái)獲得core文件的java stack和native stack的信息,從而可以輕松地知道java程序是如何崩潰和在程序何處發(fā)生問(wèn)題。另外,jstack工具還可以附屬到正在運(yùn)行的java程序中,看到當(dāng)時(shí)運(yùn)行的java程序的java stack和native stack的信息, 如果現(xiàn)在運(yùn)行的java程序呈現(xiàn)hung的狀態(tài),jstack是非常有用的。
命令格式jstack [option] LVMIDoption參數(shù)
示例-F : 當(dāng)正常輸出請(qǐng)求不被響應(yīng)時(shí),強(qiáng)制輸出線程堆棧
-l : 除堆棧外,顯示關(guān)于鎖的附加信息
-m : 如果調(diào)用到本地方法的話,可以顯示C/C++的堆棧
$ jstack -l 11494|more 2016-07-28 13:40:04 Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.71-b01 mixed mode): "Attach Listener" daemon prio=10 tid=0x00007febb0002000 nid=0x6b6f waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE Locked ownable synchronizers: - None "http-bio-8005-exec-2" daemon prio=10 tid=0x00007feb94028000 nid=0x7b8c waiting on condition [0x00007fea8f56e000] java.lang.Thread.State: WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for <0x00000000cae09b80> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043) at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:104) at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:32) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745) Locked ownable synchronizers: - None .....分析
這里有一篇文章解釋的很好
分析打印出的文件內(nèi)容
jinfo(JVM Configuration info)這個(gè)命令作用是實(shí)時(shí)查看和調(diào)整虛擬機(jī)運(yùn)行參數(shù)。
之前的jps -v口令只能查看到顯示指定的參數(shù),如果想要查看未被顯示指定的參數(shù)的值就要使用jinfo口令
jinfo [option] [args] LVMIDoption參數(shù)
示例-flag : 輸出指定args參數(shù)的值
-flags : 不需要args參數(shù),輸出所有JVM參數(shù)的值
-sysprops : 輸出系統(tǒng)屬性,等同于System.getProperties()
$ jinfo -flag 11494 -XX:CMSInitiatingOccupancyFraction=80
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/66246.html
面試官:今天要不來(lái)聊聊JVM調(diào)優(yōu)相關(guān)的吧?面試官:你曾經(jīng)在生產(chǎn)環(huán)境下有過(guò)調(diào)優(yōu)JVM的經(jīng)歷嗎?候選者:沒(méi)有面試官:...候選者:嗯...是這樣的,我們一般優(yōu)化系統(tǒng)的思路是這樣的候選者:1. 一般來(lái)說(shuō)關(guān)系型數(shù)據(jù)庫(kù)是先到瓶頸,首先排查是否為數(shù)據(jù)庫(kù)的問(wèn)題候選者:(這個(gè)過(guò)程中就需要評(píng)估自己建的索引是否合理、是否需要引入分布式緩存、是否需要分庫(kù)分表等等)候選者:2. 然后,我們會(huì)考慮是否需要擴(kuò)容(橫向和縱向都...
摘要:指標(biāo)虛擬內(nèi)存已使用的大小,如果大于,表示你的機(jī)器物理內(nèi)存不足了每秒從磁盤讀入虛擬內(nèi)存的大小,如果這個(gè)值大于,表示物理內(nèi)存不夠用或者內(nèi)存泄露了,要查找耗內(nèi)存進(jìn)程解決掉。每秒虛擬內(nèi)存寫入磁盤的大小,如果這個(gè)值大于,同上,單位為。 原理剖析(第 013 篇)應(yīng)用系統(tǒng)性能調(diào)優(yōu) - 一、大致介紹 1. 本人接手的一個(gè)打車系統(tǒng),因?yàn)槌霈F(xiàn)了一次響應(yīng)十分緩慢的情況,因此才有了應(yīng)用調(diào)優(yōu)的篇章; 2、由于...
摘要:原文鏈接這是專家系列文章的第二篇。運(yùn)行在本地虛擬機(jī)上的應(yīng)用的又稱為,通常與相同。性能數(shù)據(jù)需要持續(xù)觀察,因此在運(yùn)行時(shí)需要定時(shí)輸出的監(jiān)控信息。新生代容量的統(tǒng)計(jì)信息。是提供的一個(gè)式的圖表監(jiān)控工具。 原文鏈接:http://www.cubrid.org/blog/dev-platform/how-to-monitor-java-garbage-collection/ 這是GC專家系列文章的第二...
摘要:原文鏈接本篇是專家系列的第三篇。但是,請(qǐng)記住調(diào)優(yōu)是不得已時(shí)的選擇??s短耗時(shí)的單次執(zhí)行與相比,耗時(shí)有較明顯的增加。創(chuàng)建文件過(guò)程中,進(jìn)程會(huì)中斷,因此不要在正常運(yùn)行時(shí)系統(tǒng)上做此操作。因此校驗(yàn)結(jié)果并根據(jù)具體的服務(wù)需要,決定是否要進(jìn)行調(diào)優(yōu)。 原文鏈接:http://www.cubrid.org/blog/dev-platform/how-to-tune-java-garbage-collecti...
摘要:最黑科技的玩法就是字節(jié)碼編程,也就是動(dòng)態(tài)修改或是動(dòng)態(tài)生成字節(jié)碼。使用字節(jié)碼編程可以玩出很多高級(jí)玩法,其中最高級(jí)的玩法是在程序運(yùn)行時(shí)進(jìn)行字節(jié)碼修改和代碼注入。 showImg(https://segmentfault.com/img/bVbkqqg?w=1142&h=640);這個(gè)是我訂閱 陳皓老師在極客上的專欄《左耳聽風(fēng)》,我貼出來(lái)是為了自己以后方便學(xué)習(xí)和記憶,同時(shí)也分享給你們一起學(xué)習(xí)...
閱讀 1654·2019-08-30 13:04
閱讀 2205·2019-08-30 12:59
閱讀 1764·2019-08-29 18:34
閱讀 1857·2019-08-29 17:31
閱讀 1255·2019-08-29 15:42
閱讀 3530·2019-08-29 15:37
閱讀 2857·2019-08-29 13:45
閱讀 2771·2019-08-26 13:57