不是web项目,纯java项目Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
学习是最好的投资!
不同意 @方正 的意見,也看到過很多人一發生 OOM 就開始改動堆內存的大小,而且調整堆內存也未必是越大越好。
先普及知識:
堆內存分為新生代和老年代,新生代的用來存儲經常要進行GC 的對象,每個對象實例都會有計數,都超過一定的時間仍未被GC,就會晉升到老年代儲存。
老年代會比新生代的空間大一些。
發生 OOM 都是老年代的內存不足(因為新生代的不足的情況下,會放到老年代進行存儲)。
建議按照如下的方式進行分析,解決問題:
1.直接檢查程式碼是否有問題,看看是否有死循環、集合未釋放元素引用等記憶體外洩問題。
2.設定 JVM 參數 -XX:+HeapDumpOutOfMemoryError 和 -XX:HeapDumpPath=<你的path>
-XX:+HeapDumpOutOfMemoryError
-XX:HeapDumpPath=<你的path>
3.採用記憶體映像分析工具(http://www.eclipse.org/mat/),分析到底是記憶體洩漏還是記憶體溢位,記憶體外洩的情況下,找出外洩物件怎樣和GC ROOTS關聯的,進而找到洩漏程式碼的位置。
4.如果不存在內存洩露,結合機器的物理內存,看看是否還可以繼續調大堆內存(-Xms 和-Xmx),這裡也注意一下,並不是堆內存設置的越大越好,因為很大的記憶體發生FULL GC 的時候,會發送很久的"stop the world",這也不能接受的
簡單的解決方式就是調整堆的大小在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配置大內存是不夠了,需要找到源頭,如果有內存洩漏問題存在,用再大的內存也是沒用
不同意 @方正 的意見,也看到過很多人一發生 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",這也不能接受的
簡單的解決方式就是調整堆的大小
在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配置大內存是不夠了,需要找到源頭,如果有內存洩漏問題存在,用再大的內存也是沒用