2012-04-06 40 views
0

我想減少Java應用程序的內存佔用量以減少交換。爲了這個目的,我一直在考慮減小堆棧大小(Xss參數),但不知道如何分配堆棧內存以及每個線程的默認512k(對於32位操作系統)是否始終駐留在駐留內存中,而不管其數量是多少實際使用。Java減少堆棧大小以節省內存

堆疊內存減少會導致交換減少嗎?

更新:請不要建議分析應用程序 - 它已經完成。

+1

發生了什麼導致你相信堆棧大小問題是什麼? – JaredPar 2012-04-06 23:34:00

+0

問題是沒有足夠的內存和一些內存需要被削減,我不明白我可以從堆或燙髮中刪除 – 2012-04-06 23:36:13

+2

解決這個問題的第一步是分析應用程序。直到你知道什麼是記憶,你基本上都在猜測,並且很可能最終將時間花在一個不存在的問題上。分析器會給你提供有關應用程序中的內存的直接信息,這可能是你不希望這樣做的。 – JaredPar 2012-04-06 23:37:19

回答

0

是的,它當然會的LIFO規則後進先出,更低的堆疊少多少內存你用了多少,你需要保存交換

0

由於堆棧只有512K每個線程,這意味着你將需要200個線程開始進入,可能是值得保存(100兆)

因爲使用堆棧內存的值將是「非常頻繁」我會認爲這是一個糟糕的目標被換出。除非你正在處理內存受限的環境?

+0

的確,它是一個內存受限的環境 – 2012-04-07 00:18:09

+0

該死的,我忘了提。最簡單的事情就是試試看,看看是否有幫助。 我看到你的應用程序設置爲使用640MB,但目標機器有多少內存? – pimaster 2012-04-07 00:31:00

+0

這很難計算,還有其他進程在該機器上運行,並且其內存消耗較少定義。此外,很難說操作系統本身需要多少內存。 – 2012-04-07 00:33:36

5

你有多少個線程在運行?即使有大量的線程和非常大的堆棧大小(比如,10k線程和256KB的堆棧大小),只有2GB的堆空間。

你說你在32位JVM上運行,所以我認爲這是一個相對較小的系統。您有幾個選項:

  • 切換到64位JVM。現在你有大量的地址空間和堆棧大小應該是無關緊要的

  • 你的機器太小了。如果堆棧的2gb對於你的10k +線程來說是一個問題,那麼你在一臺機器的「小」應用程序上運行得太「大」。少做軟件或購買更多的硬件

  • 降低您的線程數

  • 這個問題實際上是在其他地方,你是找錯了樹

+0

OP聲稱它是交換,這意味着它沒有耗盡地址空間,而是物理內存。不會切換到64位只會使問題變得更糟? – trutheality 2012-04-07 00:19:03

+0

這是一個內存受限的環境。 Xmx值爲640 MB,有數百個線程 – 2012-04-07 00:19:52

+1

@Artiom *數百個*線程?只有一個功能非常強大的服務器才能同時處理大量的線程。你可能應該看看ThreadPools。 – Voo 2012-04-07 01:39:32