jvm內存溢出的三種情況以及解決辦法


1       前言
相信有一定java開發經驗的人或多或少都會遇到OutOfMemoryError的問題,這個問題曾困擾了我很長時間,隨着解決各類問題經驗的積累以及對問題根源的探索,終於有了一個比較深入的認識。

在解決java內存溢出問題之前,需要對jvm(java虛擬機)的內存管理有一定的認識。jvm管理的內存大致包括三種不同類型的內存區域:Permanent Generation space(永久保存區域)、Heap space(堆區域)、Java Stacks(Java棧)。其中永久保存區域主要存放Class(類)和Meta的信息,Class第一次被Load的時候被放入PermGen space區域,Class需要存儲的內容主要包括方法和靜態屬性。堆區域用來存放Class的實例(即對象),對象需要存儲的內容主要是非靜態屬性。每次用new創建一個對象實例后,對象實例存儲在堆區域中,這部分空間也被jvm的垃圾回收機制管理。而Java棧跟大多數編程語言包括匯編語言的棧功能相似,主要基本類型變量以及方法的輸入輸出參數。Java程序的每個線程中都有一個獨立的堆棧。容易發生內存溢出問題的內存空間包括:Permanent Generation space和Heap space。

 

2       第一種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文件中一系列環境變量名說明結束處(大約在70行左右) 增加一行:

JAVA_OPTS=" -XX:PermSize=64M -XX:MaxPermSize=128m"

 

3       第二種OutOfMemoryError:  Java heap space
發生這種問題的原因是java虛擬機創建的對象太多,在進行垃圾回收之間,虛擬機分配的到堆內存空間已經用滿了,與Heap space有關。解決這類問題有兩種思路:

1. 檢查程序,看是否有死循環或不必要地重復創建大量對象。找到原因后,修改程序和算法。(如果找不到原因,參考5.如何利用工具檢查內存泄露)

2. 增加Java虛擬機中Xms(初始堆大小)和Xmx(最大堆大小)參數的大小。如:set JAVA_OPTS= -Xms256m -Xmx1024m

 

4       第三種OutOfMemoryError:unable to create new native thread
這種錯誤在Java線程個數很多的情況下容易發生,一般有兩種可能:

ü   在程序里面使用了http-client,http-client 有兩個超時參數,但實際只設置了一個參數,然后當對方的服務器宕機之后,httpClient一直處於等待狀態,導致線程堆積。

n   httpClient-3.0的超時時間設置代碼如下:

httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(10000); //設置連接超時時間

httpClient.getHttpConnectionManager().getParams().setSoTimeout(10000);//當連接上之后,等待對方傳輸數據的超時時間(大部分是這個時間忘記設置)

n   httpClient-4.0的超時時間設置代碼如下:

         HttpPost httpPost = new HttpPost(url);

         RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(10000).setConnectTimeout(10000).build();//設置請求和傳輸超時時間

        

ü   做了多線程,而每個線程的耗時過多導致的(新增線程的速度比處理完成線程的速度快)。這種情況只能通過優化程序或者進行集群化部署來解決。

原文:https://blog.csdn.net/xxxx3/article/details/81009524


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM