2011-03-03 205 views
4

我不是Java開發人員,但是一個應用程序落在了我的桌子上。這是一個在Tomcat容器中運行的Web服務服務器端應用程序。用戶從客戶端應用程序中找到它。Java/Tomcat堆大小問題

用戶經常抱怨它的速度有多慢,應用程序必須每週重新啓動兩次,導致事情變得非常糟糕。

之前的開發人員告訴我,應用程序只是內存不足(隨着時間的推移會加載更多的數據),並最終花費所有時間進行垃圾回收。同時,Tomcat的堆大小設置爲6GB。盒子本身有32GB的RAM。

將堆大小增加到16GB會有什麼壞處嗎?
看起來像一個簡單的方法來解決這個問題,但我不是Java專家。

+1

也許你應該弄清楚你想要「永久」緩存的數據的總大小是多少。否則,看起來你需要更好的緩存解決方案(Ehcache)。 – 2011-03-03 18:55:58

回答

2

不,將堆大小增加到16GB並沒有什麼壞處。

5

你應該確定泄漏並修復它,而不是增加更多的堆空間。這只是一個停止的差距。

您應該配置tomcat以便在發生錯誤時轉儲堆,然後在崩潰後分析任意數量的工具之一中的堆。你可以計算所有分類的保留大小,這應該給你一個非常清楚的錯誤畫面。

我的個人資料我有一個關於此博客文章的鏈接,因爲我最近不得不這樣做。

+0

@hvgotcodes沒有內存泄漏。隨着時間的推移,應用程序必須將巨大的數據集加載到內存中。最終,它加載了足夠的這些數據集,其內存不足。原因是,它不會在完成數據集之後卸載數據集,因爲另一個用戶可能需要相同的信息。將數據集加載到RAM中是最耗時的步驟。 – AngryHacker 2011-03-03 18:22:04

+1

@angryhacker,那麼它的做法不正確。你有一個應用程序,在正常操作下,經過一段時間後,它總是會崩潰。您應該緩存合理數量的數據,而不是全部數據。 – hvgotcodes 2011-03-03 18:23:37

+0

@angryhacker,你可以做的一件事就是編寫某種操作系統級別的進程,以便在你有輕量使用時每隔n天重新啓動應用服務器。但這不是一個修復,它只是讓用戶看起來更好... – hvgotcodes 2011-03-03 18:25:59

1

以前的開發商告訴我,只是應用程序運行的內存(因爲它隨着時間的推移加載更多的數據)

這看起來像一個內存泄露,在應用中一個嚴重的錯誤。如果將可用內存的數量從6增加到16 GiB,則仍然需要重新啓動應用程序,但頻率不高。一些有經驗的開發人員應該在運行時查看應用程序堆(查看hvgotcodes提示)並修復應用程序。

+0

我向你保證,應用程序不會耗盡內存,因爲它已經足夠加載所有數據。沒有內存泄漏。我已經刪除了大部分數據,並在我的機器上嘗試過,並且它運行良好。然而,在本地嘗試它是一回事,而有1000多名用戶擊中它卻是另一回事。 – AngryHacker 2011-03-03 18:30:45

1

要解決這些問題,您需要執行性能測試。這包括CPU和內存分析。 JDK(6)捆綁了一個名爲VisualVM的工具,在我的Mac OS X機器上,默認路徑爲「jvisualvm」。這是免費和捆綁的,所以這是一個開始的地方。

接下來是NetBeans Profiler(netbeans.org)。這可以做更多的內存和CPU分析。它也是免費的,但有點複雜。

如果你可以花錢,我強烈推薦YourKit(http://www.yourkit.com/)。這不是非常昂貴,但它有很多內置的診斷程序,可以更容易地弄清楚發生了什麼。

你不能做的一件事就是假設只是增加更多的內存就能解決問題。如果是泄漏,增加更多內存可能會使它在重新啓動之間運行得非常糟糕。

1

我建議你使用JProfiler,VisualVM,jConsole,YourKit等分析工具。你可以把你的應用程序的堆轉儲和分析哪些對象吃掉了內存。