搜尋

首頁  >  問答  >  主體

作为java项目OutOfMemoryError怎么处理,不是javaweb,不是tomcat溢出?

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

PHPzPHPz2898 天前438

全部回覆(4)我來回復

  • 伊谢尔伦

    伊谢尔伦2017-04-18 09:37:28

    不同意 @方正 的意見,也看到過很多人一發生 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",這也不能接受的

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-18 09:37:28

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

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

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

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-18 09:37:28

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

    回覆
    0
  • 巴扎黑

    巴扎黑2017-04-18 09:37:28

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

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

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

    回覆
    0
  • 取消回覆