作为java项目OutOfMemoryError怎么处理,不是javaweb,不是tomcat溢出?
PHPz
PHPz 2017-04-18 09:35:28
0
4
431

不是web项目,纯java项目
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

PHPz
PHPz

学习是最好的投资!

全部回覆(4)
伊谢尔伦

不同意 @方正 的意見,也看到過很多人一發生 OOM 就開始改動堆內存的大小,而且調整堆內存也未必是越大越好。

先普及知識:

  • 堆內存分為新生代和老年代,新生代的用來存儲經常要進行GC 的對象,每個對象實例都會有計數,都超過一定的時間仍未被GC,就會晉升到老年代儲存。

  • 老年代會比新生代的空間大一些。

  • 發生 OOM 都是老年代的內存不足(因為新生代的不足的情況下,會放到老年代進行存儲)。

建議按照如下的方式進行分析,解決問題:

1.直接檢查程式碼是否有問題,看看是否有死循環、集合未釋放元素引用等記憶體外洩問題。

2.設定 JVM 參數 -XX:+HeapDumpOutOfMemoryError-XX:HeapDumpPath=<你的path>

3.採用記憶體映像分析工具(http://www.eclipse.org/mat/),分析到底是記憶體洩漏還是記憶體溢位,記憶體外洩的情況下,找出外洩物件怎樣和GC ROOTS關聯的,進而找到洩漏程式碼的位置。

4.如果不存在內存洩露,結合機器的物理內存,看看是否還可以繼續調大堆內存(-Xms 和-Xmx),這裡也注意一下,並不是堆內存設置的越大越好,因為很大的記憶體發生FULL GC 的時候,會發送很久的"stop the world",這也不能接受的

Ty80

簡單的解決方式就是調整堆的大小
在Eclilpse中修改啟動參數,在VM arguments 加入了-Xms384m -Xmx384m

在tomcat的catalina.bat中加上-Xms384m -Xmx384m

不過,建議最好再檢查檢查代碼

左手右手慢动作

@letcheng 同意它的觀點,你只是一個純java項目,又不是web項目,你能創建多少對象,搞到堆發生OOM。所以,很大程度還是你程式碼的原因。
JDK下,有自帶的JConsole.exe工具,你可以觀察下你目前有多少對象,堆內存有多少,是在什麼時候多到發生OOM的呢。

巴扎黑

這種問題,建議用findbug或sonar等工具跑一下程式看看哪裡有記憶體外洩導致記憶體溢位的風險

java.lang.OutOfMemoryError: Java heap space是堆內存的年輕年老態內存空間都用完時候就會拋,所以一般來說此問題主要是創建的內存無法回收,例如最常見的IO類用完後不做xx.close()

光在TOMCAT配置大內存是不夠了,需要找到源頭,如果有內存洩漏問題存在,用再大的內存也是沒用

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板