我在這裏有一種情況,在這裏我們運行一個Java EE服務器並部署了多個應用程序。最近,我們一直頻繁出現OutOfMemoryException異常。我們懷疑某些應用程序可能表現不佳,可能會泄漏,或者其他。內存分析:如何檢測哪個應用程序/軟件包消耗的內存太多
問題是,我們無法確切知道哪一個。我們已經運行了一些內存分析器(比如YourKit),並且他們很擅長告訴哪些類使用最多的內存。但是它們並沒有顯示類之間的關係,所以這給我們留下了這樣的情況:我們看到有很多字符串,int數組和HashMap條目,但是我們無法確切知道它們是哪個應用程序或包來自。
有沒有辦法知道這些對象來自哪裏,所以我們可以嘗試找出分配最多內存的軟件包(或應用程序)?
是否已附上分析器向各個應用?或只是應用程序服務器? – 2010-06-02 00:52:57
你有辦法在測試服務器上分割它們嗎?給每個小堆做個最大堆......然後看看哪個爆炸了? – bwawok 2010-06-02 03:06:26
您還可以啓用GC日誌並查看堆的年輕/舊區域的大小。對於初學者,使用「-verbose:gc -XX:+ PrintGCDetails XX:+ PrintGCTimeStamps -Xloggc:PATH_FROM_ROOT/gclog.log」運行JVM – JoseK 2010-06-02 05:44:49