[Java] java.lang.OutOfMemoryError 的解決方法

看到這個訊息就是要加大記憶體空間啦,java 程式有 -xms 跟 -xmx 參數可以用,Tomcat 到了 5.0.21 之後有畫面可以設定。

20050407_01.gif


就是最下面那三行,一般只要設定 Initial memory pool (初始值) 跟 Maximum memory pool (最大值) 就可以了。

但是解決Out Of Memory Error 問題之前,一定要先了解狀況發生的原因。

一般都是發生在開啟大型檔案或跟資料庫一次拿了太多的資料,造成 Out Of Memory Error 的狀況,這時就大概要計算一下資料量的最大值是多少,並且設定所需最小及最大的記憶體空間值。

另一種狀況平時比較難查覺。就是 Servlet 或 JSP 的 Container 突然同時上線人數爆增,也相對造成記憶體需求不足,所以也必須要計算出程式所需的資料量*同時上線人數,來設定記憶體的需求量。(如果要有最佳化的值,最好是配合 gc 做調校)

有一種說法是聽來的,實際上是不是如此還有待確認。

當 CPU 速度愈快,記憶體的最小需求量也就必需愈大。原因是 CPU 愈快,短時間內能處理的資料量也就愈大,所以在 java 做 GC 之前,可能已經記憶體已經消耗完了,所以 CPU 的速度也是記憶體初始需求量的重要因素之一。

目前這三項應該足以應付絕大部份 Out Of Memory Error 的狀況,其它造成 Out Of Memory Error 的狀況,等有遇到再來補充。

8 comments On [Java] java.lang.OutOfMemoryError 的解決方法

  • 寫得很詳細,請問如果我有4G Memory,也有很大的SQL訪問量 最大的Memory 值大約要設多少?1024M是適當的嗎?

  • 不知道如何打开上述畫面。请指教!

  • John:
    適當的量只要觀察 MySQL 執行所佔的記憶體應該就很容易評估的出來。

    lingxue:
    在右下角的 Tomcat 圖示點二下應該就能看到了。

  • 谢谢你写的精彩文章
    我也遇到这个问题,但我在RESIN中使用,请问下我应该在哪里设置呢??
    谢谢!!

  • Resin 我很久沒用了,所以也不知道有沒有提供這種介面設定? 可以找一下設定檔應該會有,如果沒有的話自己手動下 -xms 跟 -xmx 就可以了。

  • 找不到发生Out Of Memory Error 的原因
    数据量很大的时候 没有办法调试啊

  • 可是如果是突然发生的错误呢?
    比如在日志里看到凌晨4点钟突然出现的outofmemory错误,因为是学校的管理系统,所以那个时间应该是绝对没有人访问的!
    在没有任何预兆的情况下出现的这个错误,有谁碰到过没有啊?

  • 請問在tomcat 4.X要如何設定Xms and Xmx?

Leave a reply:

Your email address will not be published.

Site Footer

Sliding Sidebar