摘要:以下各節(jié)描述由處理程序跟蹤的數(shù)據(jù)線程轉(zhuǎn)儲(chǔ)檢測(cè)死鎖堆摘要線程轉(zhuǎn)儲(chǔ)線程轉(zhuǎn)儲(chǔ)由線程堆棧包括線程狀態(tài)組成用于虛擬機(jī)中的所有線程。線程轉(zhuǎn)儲(chǔ)不會(huì)終止應(yīng)用程序在打印線程信息之后它將繼續(xù)。檢測(cè)死鎖除了線程堆棧之外控件中斷處理程序還執(zhí)行死鎖檢測(cè)算法。
2.19 Control + Break 處理程序
在 Oracle Solaris 或 Linux 操作系統(tǒng)上, 在應(yīng)用程序控制臺(tái) (標(biāo)準(zhǔn)輸入) 中按下Ctrl控制鍵和反斜線 () 鍵的組合會(huì)導(dǎo)致 Java 熱點(diǎn) VM 將線程轉(zhuǎn)儲(chǔ)打印到應(yīng)用程序的標(biāo)準(zhǔn)輸出。在 Windows 上, 等效的鍵序列是控件和中斷鍵。這些組合鍵的一般術(shù)語(yǔ)是Control + Break 處理程序。
在 Oracle Solaris 和 Linux 操作系統(tǒng)上, 如果 Java 進(jìn)程收到退出信號(hào), 則會(huì)打印一個(gè)線程轉(zhuǎn)儲(chǔ)。因此, kill -QUIT pid命令會(huì)導(dǎo)致帶有 ID pid的進(jìn)程將線程轉(zhuǎn)儲(chǔ)打印到標(biāo)準(zhǔn)輸出。
以下各節(jié)描述由Control + Break 處理程序跟蹤的數(shù)據(jù):
線程轉(zhuǎn)儲(chǔ)
檢測(cè)死鎖
堆摘要
2.19.1線程轉(zhuǎn)儲(chǔ)
線程轉(zhuǎn)儲(chǔ)由線程堆棧 (包括線程狀態(tài)) 組成, 用于虛擬機(jī)中的所有 Java 線程。線程轉(zhuǎn)儲(chǔ)不會(huì)終止應(yīng)用程序: 在打印線程信息之后, 它將繼續(xù)。
示例 2-35闡釋了一個(gè)線程轉(zhuǎn)儲(chǔ)。
JVM 中所有 Java 線程的示例2-35 線程轉(zhuǎn)儲(chǔ)
Full thread dump Java HotSpot(TM) Client VM (1.6.0-rc-b100 mixed mode): "DestroyJavaVM" prio=10 tid=0x00030400 nid=0x2 waiting on condition [0x00000000..0xfe77fbf0] java.lang.Thread.State: RUNNABLE "Thread2" prio=10 tid=0x000d7c00 nid=0xb waiting for monitor entry [0xf36ff000..0xf36ff8c0] java.lang.Thread.State: BLOCKED (on object monitor) at Deadlock$DeadlockMakerThread.run(Deadlock.java:32) - waiting to lock <0xf819a938> (a java.lang.String) - locked <0xf819a970> (a java.lang.String) "Thread1" prio=10 tid=0x000d6c00 nid=0xa waiting for monitor entry [0xf37ff000..0xf37ffbc0] java.lang.Thread.State: BLOCKED (on object monitor) at Deadlock$DeadlockMakerThread.run(Deadlock.java:32) - waiting to lock <0xf819a970> (a java.lang.String) - locked <0xf819a938> (a java.lang.String) "Low Memory Detector" daemon prio=10 tid=0x000c7800 nid=0x8 runnable [0x00000000..0x00000000] java.lang.Thread.State: RUNNABLE "CompilerThread0" daemon prio=10 tid=0x000c5400 nid=0x7 waiting on condition [0x00000000..0x00000000] java.lang.Thread.State: RUNNABLE "Signal Dispatcher" daemon prio=10 tid=0x000c4400 nid=0x6 waiting on condition [0x00000000..0x00000000] java.lang.Thread.State: RUNNABLE "Finalizer" daemon prio=10 tid=0x000b2800 nid=0x5 in Object.wait() [0xf3f7f000..0xf3f7f9c0] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0xf4000b40> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116) - locked <0xf4000b40> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132) at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159) "Reference Handler" daemon prio=10 tid=0x000ae000 nid=0x4 in Object.wait() [0xfe57f000..0xfe57f940] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0xf4000a40> (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 <0xf4000a40> (a java.lang.ref.Reference$Lock) "VM Thread" prio=10 tid=0x000ab000 nid=0x3 runnable "VM Periodic Task Thread" prio=10 tid=0x000c8c00 nid=0x9 waiting on condition
輸出由一個(gè)由空行分隔的多個(gè)線程項(xiàng)組成。java 線程 (能夠執(zhí)行 java 語(yǔ)言代碼的線程) 首先打印出來(lái), 后面是有關(guān) VM 內(nèi)部線程的信息。每個(gè)線程項(xiàng)都由標(biāo)題行和線程堆棧跟蹤組成。
標(biāo)題行包含有關(guān)線程的以下信息:
線程名稱
指示線程是否為守護(hù)進(jìn)程線程
線程優(yōu)先級(jí) (prio)
線程 ID (tid), 它是內(nèi)存中線程結(jié)構(gòu)的地址
本機(jī)線程的 ID (nid)
線程狀態(tài), 指示線程在線程轉(zhuǎn)儲(chǔ)時(shí)所做的操作。有關(guān)詳細(xì)信息, 請(qǐng)參見(jiàn)表 2-6 。
地址范圍, 它給出了線程的有效堆棧區(qū)域的估計(jì)值。
2.19.2檢測(cè)死鎖
除了線程堆棧之外, 控件 + 中斷處理程序還執(zhí)行死鎖檢測(cè)算法。如果檢測(cè)到任何死鎖, 則控制 + 中斷處理程序 (如示例 2-36所示) 在每個(gè)已死鎖線程上的線程轉(zhuǎn)儲(chǔ)之后打印附加信息。
示例2-36 死鎖線程的附加信息
Found one Java-level deadlock: ============================= "Thread2": waiting to lock monitor 0x000af330 (object 0xf819a938, a java.lang.String), which is held by "Thread1" "Thread1": waiting to lock monitor 0x000af398 (object 0xf819a970, a java.lang.String), which is held by "Thread2" Java stack information for the threads listed above: =================================================== "Thread2": at Deadlock$DeadlockMakerThread.run(Deadlock.java:32) - waiting to lock <0xf819a938> (a java.lang.String) - locked <0xf819a970> (a java.lang.String) "Thread1": at Deadlock$DeadlockMakerThread.run(Deadlock.java:32) - waiting to lock <0xf819a970> (a java.lang.String) - locked <0xf819a938> (a java.lang.String) Found 1 deadlock.
如果設(shè)置了 JVM 標(biāo)志-XX:+PrintConcurrentLocks , 則Control + Break 處理程序還將打印每個(gè)線程擁有的并發(fā)鎖的列表。
2.19.3堆摘要
Control + Break 處理程序也會(huì)打印堆摘要.示例 2-37顯示不同的世代 (堆的區(qū)域), 大小、使用量和地址范圍。如果同時(shí)使用工具 (如pmap ) 檢查進(jìn)程, 則地址范圍尤其有用。.
示例2-37 堆摘要
Heap def new generation total 1152K, used 435K [0x22960000, 0x22a90000, 0x22e40000 ) eden space 1088K, 40% used [0x22960000, 0x229ccd40, 0x22a70000) from space 64K, 0% used [0x22a70000, 0x22a70000, 0x22a80000) to space 64K, 0% used [0x22a80000, 0x22a80000, 0x22a90000) tenured generation total 13728K, used 6971K [0x22e40000, 0x23ba8000, 0x269600 00) the space 13728K, 50% used [0x22e40000, 0x2350ecb0, 0x2350ee00, 0x23ba8000) compacting perm gen total 12288K, used 1417K [0x26960000, 0x27560000, 0x2a9600 00) the space 12288K, 11% used [0x26960000, 0x26ac24f8, 0x26ac2600, 0x27560000) ro space 8192K, 62% used [0x2a960000, 0x2ae5ba98, 0x2ae5bc00, 0x2b160000) rw space 12288K, 52% used [0x2b160000, 0x2b79e410, 0x2b79e600, 0x2bd60000)
如果設(shè)置了 JVM 標(biāo)志-XX:+PrintClassHistogram , 則Control + Break 處理程序?qū)⑸啥阎狈綀D。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/68930.html
摘要:在語(yǔ)言規(guī)范中也提到如果在語(yǔ)句塊中包含語(yǔ)句,那么語(yǔ)句會(huì)在其之前執(zhí)行。并且還需要注意的是,中的會(huì)覆蓋中的。 關(guān)于 try 和 finally 中的 return 首先我們來(lái)看一段代碼: public class Test { public static int inc() { int x = 1; try { return...
摘要:然而對(duì)于一個(gè)和關(guān)聯(lián)的線程來(lái)說(shuō)在線程被創(chuàng)建和更新他的之前會(huì)有一個(gè)小窗口,因此必須檢查這種情況為線程結(jié)構(gòu)體分配內(nèi)存并創(chuàng)建線程??赡苁?,因此我們耗盡了內(nèi)存太多的活躍線程。代碼執(zhí)行到這,線程還是狀態(tài),因?yàn)榫€程必須被創(chuàng)建者直接啟動(dòng)。 引言 說(shuō)到Thread大家都很熟悉,我們平常寫(xiě)并發(fā)代碼的時(shí)候都會(huì)接觸到,那么我們來(lái)看看下面這段代碼是如何初始化以及執(zhí)行的呢? public class Thread...
摘要:本文將模擬一個(gè)歐派,讓大家足不出戶在家里就能更加直觀立體的挑選家具。創(chuàng)建廣告牌寬度高度深度寬度上的節(jié)數(shù)高度上的節(jié)數(shù)深度上的節(jié)數(shù)中心點(diǎn)家具展銷歐派這里給我們給整個(gè)場(chǎng)景用抽象物體圍起來(lái)了,以免第一人稱控件開(kāi)啟時(shí)會(huì)造成無(wú)碰撞體系墜落出場(chǎng)景。 本文將模擬一個(gè)歐派,讓大家足不出戶在家里就能更加直觀立體的挑選家具。 第一步,利用CampusBuilder搭建模擬場(chǎng)景。CampusBuilder的模...
摘要:文章列出解決方案以及對(duì)應(yīng)的,拒絕說(shuō)概念,不在稀里糊涂。服務(wù)器據(jù)此決定,該實(shí)際請(qǐng)求是否被允許。在有效時(shí)間內(nèi),瀏覽器無(wú)須為同一請(qǐng)求再次發(fā)起預(yù)檢請(qǐng)求。請(qǐng)注意,瀏覽器自身維護(hù)了一個(gè)最大有效時(shí)間,如果該首部字段的值超過(guò)了最大有效時(shí)間,將不會(huì)生效。 文章列出解決方案以及對(duì)應(yīng)的demo, 拒絕說(shuō)概念,不在稀里糊涂。 什么情況出現(xiàn)跨域? 協(xié)議不同 域名不同 端口不同 跨域解決方案 1.同一個(gè)主域下...
摘要:關(guān)于跨域?yàn)槭裁磿?huì)有跨域我們得先了解下同源策略。簡(jiǎn)而言之,同協(xié)議同域名同端口號(hào)什么是跨域跨域就是采取技術(shù)方案突破同源策略的限制,實(shí)現(xiàn)不同域之間交互請(qǐng)求響應(yīng)。 關(guān)于跨域 why? 為什么會(huì)有跨域? 我們得先了解下 ==同源策略(SOP, Same Origin Policy)==。 瀏覽器出于安全方面的考慮,只能訪問(wèn)與包含它的頁(yè)面位于同一個(gè)域中的資源,該策略為通信設(shè)置了相同的協(xié)議、相同的域...
閱讀 1068·2023-04-25 14:41
閱讀 2527·2021-09-28 09:35
閱讀 3685·2019-08-30 15:53
閱讀 2007·2019-08-29 15:26
閱讀 1136·2019-08-28 17:59
閱讀 4415·2019-08-26 13:45
閱讀 2897·2019-08-26 13:33
閱讀 1694·2019-08-26 11:46