2013-05-06 84 views
1

我有一個Java/Java EE Web應用程序。Java Web應用程序:高堆使用和被阻塞的線程 - 同時

通常,當我看到應用程序由於堆使用率高(或內存不足情況)而停止響應時,我還會看到線程被阻塞(通過線程轉儲) - 通常是記錄和隨機事件。

我在Web應用程序中看到過這種情況。

內存不足情況與被阻塞的線程之間是否存在任何關聯?

回答

1

是的,OOM和被阻塞的線程之間有直接的相關性。這是由於線程試圖在堆上分配內存並且無法獲得足夠的內存。大多數情況下,您會在日誌,類加載,資源查找,IO等方面看到阻塞的線程。這些都是需要新內存分配的情況。

0

是的,存在相關性。雖然線程共享堆但他們有自己的堆棧。兩者都是從可用內存分配的內存。一個線程可能正在做一些工作,正如你在案例日誌中提到的那樣。對於日誌記錄線程可能會在內存中保留一些日誌,並將嘗試將它們放入日誌文件中。由於存在不同的日誌記錄線程,因此他們將等待輪到獲得日誌文件的訪問權限。如果線程等待文件的時間太長,那麼他們會將日誌數據保存在內存中很長時間。如果這種情況持續發生,那麼內存中數據太多的線程就會太多。當有人試圖獲得內存並且沒有任何可用時,JVM最終會遇到內存不足的情況。

1

是的,因爲線程是你的代碼執行的地方,你的代碼需要內存。 Java是面向對象的,因此創建新對象是非常普遍的事情。當JVM遇到內存問題時,嘗試分配更多的內存塊,直到可以授予內存爲止。與外部系統(I/O)的接口是看到線程阻塞的共同點,因爲它們通常涉及大量的內存分配塊(例如用於格式化的字符串緩衝區,由類加載程序在.class文件中讀取,爲數據庫結果集生成對象)。

這是爲什麼排除OutOfMemoryError非常困難的原因之一。當您的堆空間耗盡/耗盡時,每件事情都會放慢速度並突破,從而將症狀與原因分離變得困難。

相關問題