[英]Should all these default threads be Running? And do they keep my JVM alive?
我有一個關於我的應用程序在執行過程中產生的線程及其狀態的問題。
我有一個Swing應用程序,我注意到在一些測試場景中使用Java VisualVM有幾個奇怪的行為。 運行我的程序30分鍾不做任何事情(剛開始並讓它繼續運行)我注意到以下內容。
首先,在Threads選項卡中,我看到很多活動線程。
讀取(除其他外) 默認線程,如DestroyJavaVM,Reference Handler,Signal Dispatcher以及Java應用程序開始執行時spwaned的這些線程是什么? 我理解大多數這些主題都有很好的理由去那里。 (我仍在試圖找出“RMI TCP”)
但是我對他們的狀態表示懷疑。 前六個人100%處於跑步狀態是否正常?
此外,這些線程中的任何一個都能解釋如下所示的堆消耗嗎?
我注意到很多HashMap $ Entry和TreeMap $ Entry的實例都是由源自sun.rmi。*的庫引用和創建的,我認為它可能與“RMI TCP”線程相關...
最后但並非最不重要的,如果我嘗試dispose()我的主JFrame,框架本身將消失,但應用程序仍將運行....這些線程可能是原因(或其中的一部分)?
謝謝大家。
我仍在試圖找出“RMI TCP”
這些線程用於通過RMI接受和處理JMX連接。 在查看JVisualVM時,您正在使用一個。 您是否注意到工作線程名稱中的IP?
但是我對他們的狀態表示懷疑。 前六個人100%處於跑步狀態是否正常?
僅僅因為線程是可運行的 ,並不意味着它正在運行並消耗CPU時間。 引用Thread.State
:
新 - 尚未啟動的線程處於此狀態。
RUNNABLE - 在Java虛擬機中執行的線程處於此狀態。
BLOCKED - 阻塞等待監視器鎖定的線程處於此狀態。
WAITING - 一個無限期等待另一個線程執行特定操作的線程處於此狀態。
TIMED_WAITING - 正在等待另一個線程執行最多指定等待時間的操作的線程處於此狀態。
TERMINATED - 已退出的線程處於此狀態。
正如您所看到的,此列表未提及有關等待I / O(如套接字)的信息。 執行此任務的線程仍標記為可運行 。 顯然等待數據不會占用任何CPU。 接受連接的線程也是可運行的 ,而它什么都不做。 當客戶端嘗試建立新連接時,它將被喚醒。
此外,這些線程中的任何一個都能解釋如下所示的堆消耗嗎?
你的堆消耗是正常和健康的。 鋸齒形狀是由垃圾收集去除不再需要的物體引起的。 JVM還發現你的堆消耗非常不變,所以它不斷減少最大堆大小,因為它認為你不需要那么多(橙色圖)。
最后但並非最不重要的,如果我嘗試dispose()我的主JFrame,框架本身將消失,但應用程序仍將運行....這些線程可能是原因(或其中的一部分)?
那是因為你只關閉了一個JFrame
,而不是整個應用程序。 Swing EDT( 事件調度線程 )仍在運行。 但這與它無關。 只需使用:
jFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
在你的主框架上。
如果考慮線程和內存消耗, 您的應用程序是完全正常的 。 別擔心!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.