1. 程式人生 > >java.lang.OutOfMemoryError及解決方案

java.lang.OutOfMemoryError及解決方案

找到 method bug 自己的 bootstrap set muc initial uri

主要有3種比較常見的OutOfMemory Error:

  • java.lang.OutOfMemoryError: Java heap space
  • java.lang.OutOfMemoryError: PermGen space
  • java.lang.OutOfMemoryError: GC overhead limit exceeded

1. java.lang.OutOfMemoryError: Java heap space

Java heap space,Java應用程序創建的對象存放在這片區域,垃圾回收(Garbage Collection)也發生在這塊區域。通常一些比較“重型”的操作可能會導致該異常,比如:需要創建大量的對象,層次比較深的遞歸操作等。
解決方案有兩種,一是優化應用,找到消耗大量內存的地方,然後優化代碼或者算法。這種方式比較推薦,但是難度比較大,尤其是在產品環境中出現這種問題,開發人員不能很好的重現問題。第二種方案是提升Java heap size,這種方式雖然感覺有點治標不治本,但是可行性非常高,操作簡單。
對於一般的應用,采用如下方式即可(數字根據自己的需要調整):

1 -Xms<size> - Set initial Java heap size
2 -Xmx<size> - Set maximum Java heap size
3  
4 java -Xms512m -Xmx1024m JavaApp

如果是在tomcat中,出現的這種問題,解決辦法是在{tomcat_dir}/bin/catalina.bat中找到如下幾行:

1 set MAINCLASS=org.apache.catalina.startup.Bootstrap
2 set ACTION=start
3 set SECURITY_POLICY_FILE=
4 set DEBUG_OPTS=
5 set JPDA=

在後面加上一行(數字根據自己的需要調整):

1 set CATALINA_OPTS=-Xms512m   -Xmx512m

2. java.lang.OutOfMemoryError: PermGen space

Perm Gen Size(Permanent Generation Size),用來存儲被加載的類的定義(class definition)和元數據(metadata),比如:Class Object和Method Object等。這是內存中的一塊永久保存區域,JVM的垃圾回收不會觸及這塊區域。通常在加載一個非常大的項目的時候才會出現該異常。
對於一般的應用,采用如下方式即可(數字根據自己的需要調整):

1 -XX:PermSize<size> - Set initial PermGen Size.
2 -XX:MaxPermSize<size> - Set the maximum PermGen Size.
3  
4 java -XX:PermSize=64m -XX:MaxPermSize=128m JavaApp

如果是在tomcat中出現這個問題,解決辦法是在{tomcat_dir}/bin/catalina.bat中添加如下一行:

1 set CATALINA_OPTS=-server -Xms256m -Xmx1024m -XX:PermSize=512m -XX:MaxPermSize=512m

3. java.lang.OutOfMemoryError: GC overhead limit exceeded

這個錯誤會出現在這個場景中:GC占用了多余98%(默認值)的CPU時間卻只回收了少於2%(默認值)的堆空間。目的是為了讓應用終止,給開發者機會去診斷問題。一般是應用程序在有限的內存上創建了大量的臨時對象或者弱引用對象,從而導致該異常。雖然加大內存可以暫時解決這個問題,但是還是強烈建議去優化代碼,後者更加有效。
首先,你可以關閉JVM這個默認的策略:

1 java -XX:-UseGCOverheadLimit JavaApp

其次,你也可以嘗試去加大Heap Size:

1 java -Xmx512m JavaApp

註意:在修改Tomcat的catalina.bat(*.sh)中的內容時,網上有很多都是說直接修改JAVA_OPTS,按照Apache官方的說法是:
Note: Do not use JAVA_OPTS to specify memory limits. You do not need much memory for a small process that is used to stop Tomcat. Those settings belong to CATALINA_OPTS.

  • Reference
    1. http://wiki.apache.org/tomcat/OutOfMemory
    2. http://www.mkyong.com/java/find-out-your-java-heap-memory-size/

java.lang.OutOfMemoryError及解決方案