2012-08-06 95 views
4

我的目標:產生的原因:java.lang.OutOfMemoryError:Java堆空間

我要運行1000個用戶我的應用程序。

NOW

我想爲100個用戶運行。在應用程序運行期間,我想爲每個用戶執行一個過程,每個用戶至少需要一個小時,所以我爲每個用戶使用一個線程。

錯誤

Caused by: java.lang.OutOfMemoryError: Java heap space

我一直試圖弄清楚這是什麼意思,但我真的不知道如何解決它。

任何人都可以幫助我嗎?

+0

似乎使用更多的內存烏爾比你 – CloudyMarble 2012-08-06 07:32:58

回答

7

此錯誤意味着您的程序需要比您的JVM允許它使用更多的內存!

因此你很可能有兩種選擇:

  1. 增加你的程序是允許使用-Xmx選項來使用(例如1024 MB:-Xmx1024m)的默認內存
  2. 修改程序,使其需要較少的內存,使用較少的大數據結構,並擺脫那些在程序中某些點不再使用的對象

正如Peter Lawrey指出的那樣,使用探查器查看wha你的程序在這種情況下做的通常是一個好主意。

4

使用帶有數量有限的工作線程的producer/consumer pattern

100多條線程很荒謬 - 難怪你的應用程序正在爆炸。

+0

我同意你的觀點,但我必須要注意的是100+的線程是不是可笑,事實上,如果檢查線程和春天有個運行Tomcat /碼頭, Hibernate,可能你已經有了大約50-60個框架相關的線程。想想吧,在tomcat池默認配置的threadPool大小是200,這意味着100+線程絕對不是那麼荒謬。這就是說,帶有工作線程的生產者/消費者模式確實是合理的解決方案,除了使每個進程需要少於1小時,並且需要更少的堆或增加maxHeapSize本身。 – 2012-08-06 07:53:59

+0

@baba對不起,但100多個線程運行100%的CPU,每個小時最少1小時*是*可笑和不生產。對於CPU綁定處理,您希望大致沒有比CPU更多的線程。 J2EE容器中的那些線程實際上都是睡着了,並且保留在那裏只是爲了保持狀態,所以當它們(偶爾)醒來做工作時,它們可以立即響應。 – Bohemian 2012-08-06 12:36:28

+0

是的,100多個線程同時運行超過1-2秒已經瘋了。我只是指出,如果其中大部分線程正在睡眠,那麼100多個線程都沒有問題,就像我在上面描述的框架中一樣。 – 2012-08-06 13:51:19

1

您還沒有提供任何信息,表明問題與StackOverflow中給出的有關此錯誤的所有答案都非常不同;

  • 您使用的內存太多,您需要使用內存分析器來減少內存。
  • 您設置的最大內存太低,你需要增加最大內存-mx-Xmx

我懷疑,既然你想在1000級的用戶運行它需要一個小時處理每個你可能需要更多的資源比你有。例如1000核心也許?我建議您根據CPU,內存,磁盤IO和網絡IO等需要的硬件來查看需要的硬件數量,以便以較高的級別運行用戶。 20個用戶,並通過50多個。

0

當您啓動應用程序時,您可以嘗試增加JVM堆空間。您可以使用-Xmx2g將它設置爲2GB。如果您運行的是32位Java,我認爲2GB的容量是可以達到的,但是如果您有64位的JVM,則應該可以更高。

編輯:

例子:java -Xmx2g MyApp

0

我將檢查2個區時,有內存不足的錯誤

  1. 是分配的內存給JVM足夠了,如果不是增加它使用-Xmx
  2. 徹底檢查代碼,超過90%的時間我發現錯誤w在某些邊界條件下,某些循環會遞歸。
相關問題