Java OutOfMemory異常

  JVM中使用了三種不同類型的內存區域:Permanent Generation space(永久保存區域)、Heap space(堆區域)、Java Stacks(Java棧)。
  永久保存區域主要存放Class(類)和Meta的信息,Class第一次被Load的時候被放入PermGen space區域,Class需要存儲的內容主要包括方法和靜態屬性。
  堆區域用來存放Class的實例(即對象),每次用new創建一個對象實例後,對象實例存儲在堆區域中,這部分空間也被jvm的垃圾回收機制管理。
  主要保存方法中的基本類型的局部變量,對象的引用。Java程序的每個線程中都有一個獨立的堆棧。
  
  容易發生內存溢出問題的內存空間包括:Permanent Generation space和Heap space。

1. OutOfMemoryError: PermGen space

  這種情況發生的原因是程序中使用了大量的jar或class,使java虛擬機裝載類的空間不夠,與Permanent Generation space有關。

解決這類問題有以下兩種辦法:
1. 增加java虛擬機中的XX:PermSize和XX:MaxPermSize參數的大小,其中XX:PermSize是初始永久保存區域大小,XX:MaxPermSize是最大永久保存區域大小。
  在項目中大多情況下都需要在tomcat6.0的啓動文件中catalina.sh 或catalina.bat 增加下面的一行:
  JAVA_OPTS=" -XX:PermSize=64M -XX:MaxPermSize=128m"
2. 如果tomcat部署了多個應用,並且這些應用都使用了相同的jar,可以將共同的jar移到tomcat的lib下,減少類的重複加載

2. OutOfMemoryError: Java heap space

發生這種問題的原因是突然創建了太多的對象,虛擬機分配的堆內存空間已經用滿了。

解決這類問題有兩種思路:
1. 減少不必要地對象的創建,儘可能不要在循環中重複創建對象。
2. 增加Java虛擬機中Xms(初始堆大小)和Xmx(最大堆大小)參數的大小。如:
 set JAVA_OPTS= -Xms256m -Xmx1024m
3. 使用完對象後,把對象設置成null

3. OutOfMemoryError:unable to create new native thread

這種情況在Java線程個數很多的情況下容易發生。

轉自:http://blog.csdn.net/lzw190/article/details/10563757

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章