摘要:以下各節描述由處理程序跟蹤的數據線程轉儲檢測死鎖堆摘要線程轉儲線程轉儲由線程堆棧包括線程狀態組成用于虛擬機中的所有線程。線程轉儲不會終止應用程序在打印線程信息之后它將繼續。檢測死鎖除了線程堆棧之外控件中斷處理程序還執行死鎖檢測算法。
2.19 Control + Break 處理程序
在 Oracle Solaris 或 Linux 操作系統上, 在應用程序控制臺 (標準輸入) 中按下Ctrl控制鍵和反斜線 () 鍵的組合會導致 Java 熱點 VM 將線程轉儲打印到應用程序的標準輸出。在 Windows 上, 等效的鍵序列是控件和中斷鍵。這些組合鍵的一般術語是Control + Break 處理程序。
在 Oracle Solaris 和 Linux 操作系統上, 如果 Java 進程收到退出信號, 則會打印一個線程轉儲。因此, kill -QUIT pid命令會導致帶有 ID pid的進程將線程轉儲打印到標準輸出。
以下各節描述由Control + Break 處理程序跟蹤的數據:
線程轉儲
檢測死鎖
堆摘要
2.19.1線程轉儲
線程轉儲由線程堆棧 (包括線程狀態) 組成, 用于虛擬機中的所有 Java 線程。線程轉儲不會終止應用程序: 在打印線程信息之后, 它將繼續。
示例 2-35闡釋了一個線程轉儲。
JVM 中所有 Java 線程的示例2-35 線程轉儲
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
輸出由一個由空行分隔的多個線程項組成。java 線程 (能夠執行 java 語言代碼的線程) 首先打印出來, 后面是有關 VM 內部線程的信息。每個線程項都由標題行和線程堆棧跟蹤組成。
標題行包含有關線程的以下信息:
線程名稱
指示線程是否為守護進程線程
線程優先級 (prio)
線程 ID (tid), 它是內存中線程結構的地址
本機線程的 ID (nid)
線程狀態, 指示線程在線程轉儲時所做的操作。有關詳細信息, 請參見表 2-6 。
地址范圍, 它給出了線程的有效堆棧區域的估計值。
2.19.2檢測死鎖
除了線程堆棧之外, 控件 + 中斷處理程序還執行死鎖檢測算法。如果檢測到任何死鎖, 則控制 + 中斷處理程序 (如示例 2-36所示) 在每個已死鎖線程上的線程轉儲之后打印附加信息。
示例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.
如果設置了 JVM 標志-XX:+PrintConcurrentLocks , 則Control + Break 處理程序還將打印每個線程擁有的并發鎖的列表。
2.19.3堆摘要
Control + Break 處理程序也會打印堆摘要.示例 2-37顯示不同的世代 (堆的區域), 大小、使用量和地址范圍。如果同時使用工具 (如pmap ) 檢查進程, 則地址范圍尤其有用。.
示例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)
如果設置了 JVM 標志-XX:+PrintClassHistogram , 則Control + Break 處理程序將生成堆直方圖。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68930.html
摘要:在語言規范中也提到如果在語句塊中包含語句,那么語句會在其之前執行。并且還需要注意的是,中的會覆蓋中的。 關于 try 和 finally 中的 return 首先我們來看一段代碼: public class Test { public static int inc() { int x = 1; try { return...
摘要:然而對于一個和關聯的線程來說在線程被創建和更新他的之前會有一個小窗口,因此必須檢查這種情況為線程結構體分配內存并創建線程??赡苁牵虼宋覀兒谋M了內存太多的活躍線程。代碼執行到這,線程還是狀態,因為線程必須被創建者直接啟動。 引言 說到Thread大家都很熟悉,我們平常寫并發代碼的時候都會接觸到,那么我們來看看下面這段代碼是如何初始化以及執行的呢? public class Thread...
摘要:本文將模擬一個歐派,讓大家足不出戶在家里就能更加直觀立體的挑選家具。創建廣告牌寬度高度深度寬度上的節數高度上的節數深度上的節數中心點家具展銷歐派這里給我們給整個場景用抽象物體圍起來了,以免第一人稱控件開啟時會造成無碰撞體系墜落出場景。 本文將模擬一個歐派,讓大家足不出戶在家里就能更加直觀立體的挑選家具。 第一步,利用CampusBuilder搭建模擬場景。CampusBuilder的模...
摘要:文章列出解決方案以及對應的,拒絕說概念,不在稀里糊涂。服務器據此決定,該實際請求是否被允許。在有效時間內,瀏覽器無須為同一請求再次發起預檢請求。請注意,瀏覽器自身維護了一個最大有效時間,如果該首部字段的值超過了最大有效時間,將不會生效。 文章列出解決方案以及對應的demo, 拒絕說概念,不在稀里糊涂。 什么情況出現跨域? 協議不同 域名不同 端口不同 跨域解決方案 1.同一個主域下...
摘要:關于跨域為什么會有跨域我們得先了解下同源策略。簡而言之,同協議同域名同端口號什么是跨域跨域就是采取技術方案突破同源策略的限制,實現不同域之間交互請求響應。 關于跨域 why? 為什么會有跨域? 我們得先了解下 ==同源策略(SOP, Same Origin Policy)==。 瀏覽器出于安全方面的考慮,只能訪問與包含它的頁面位于同一個域中的資源,該策略為通信設置了相同的協議、相同的域...
閱讀 997·2023-04-25 14:41
閱讀 2454·2021-09-28 09:35
閱讀 3624·2019-08-30 15:53
閱讀 1944·2019-08-29 15:26
閱讀 1070·2019-08-28 17:59
閱讀 4310·2019-08-26 13:45
閱讀 2840·2019-08-26 13:33
閱讀 1645·2019-08-26 11:46