1、產生內存溢出的java
一、java.lang.OutofMemoryError:Java heap space
二、java.lang.OutofMemoryError:PermGen space
三、java.lang.OutofMemoryError:unable to create new native thread
四、java.lang.OutofMemoryError:GC overhead limit exceeded
一、Java堆空間不夠,當應用程序申請更多的內存,而Java堆內存已經沒法知足應用程序對內存的須要,將拋出這種異常。服務器
二、Java永久代空間不夠,永久代中包含類的字節碼和長常量池,類的字節碼加載後的信息,這和存放對象實例的堆區是不一樣的,大多數JVM的實現都不會對永久帶進行垃圾回收,所以,只要類加載的過多就會出現這個問題。通常的應用程序都不會產生這個錯誤,然而,對於Web服務器來說,會產生有大量的JSP,JSP在運行時被動態的編譯成Java Servlet類,而後加載到方法區,所以,太多的JSP的Web工程可能產生這個異常。多線程
三、本質緣由是建立了太多的線程,而能建立的線程數是有限制的,致使了這種異常的發生。併發
四、是在並行或者併發回收器在GC回收時間過長、超過98%的時間用來作GC而且回收了不到2%的堆內存,而後拋出這種異常進行提早預警,用來避免內存太小形成應用不能正常工做。app
下面兩個異常與OOM有關係,可是,又沒有絕對關係。jvm
java.lang.StackOverflowError …優化
java.net.SocketException: Too many open filesspa
一、是JVM的線程因爲遞歸或者方法調用層次太多,佔滿了線程堆棧而致使的,線程堆棧默認大小爲1M。.net
二、是因爲系統對文件句柄的使用是有限制的,而某個應用程序使用的文件句柄超過了這個限制,就會致使這個問題。線程
2、產生緣由及解決辦法
【狀況一】: java.lang.OutOfMemoryError: Java heap space:這種是java堆內存不夠,一個緣由是真不夠,另外一個緣由是程序中有死循環; 若是是java堆內存不夠的話,能夠經過調整JVM下面的配置來解決: < jvm-arg>-Xms3062m < / jvm-arg> < jvm-arg>-Xmx3062m < / jvm-arg> 【狀況二】 java.lang.OutOfMemoryError: GC overhead limit exceeded 【解釋】:JDK6新增錯誤類型,當GC爲釋放很小空間佔用大量時間時拋出;通常是由於堆過小,致使異常的緣由,沒有足夠的內存。 【解決方案】: 一、查看系統是否有使用大內存的代碼或死循環; 二、經過添加JVM配置,來限制使用內存: < jvm-arg>-XX:-UseGCOverheadLimit< /jvm-arg> 【狀況三】: java.lang.OutOfMemoryError: PermGen space:這種是P區內存不夠,可經過調整JVM的配置: < jvm-arg>-XX:MaxPermSize=128m< /jvm-arg> < jvm-arg>-XXermSize=128m< /jvm-arg> 【注】: JVM的Perm區主要用於存放Class和Meta信息的,Class在被Loader時就會被放到PermGen space,這個區域成爲年老代,GC在主程序運行期間不會對年老區進行清理,默認是64M大小,當程序須要加載的對象比較多時,超過64M就會報這部份內存溢出了,須要加大內存分配,通常128m足夠。 【狀況四】: java.lang.OutOfMemoryError: Direct buffer memory 調整-XX:MaxDirectMemorySize= 參數,如添加JVM配置: < jvm-arg>-XX:MaxDirectMemorySize=128m< /jvm-arg> 【狀況五】: java.lang.OutOfMemoryError: unable to create new native thread 【緣由】:Stack空間不足以建立額外的線程,要麼是建立的線程過多,要麼是Stack空間確實小了。 【解決】:因爲JVM沒有提供參數設置總的stack空間大小,但能夠設置單個線程棧的大小;而系統的用戶空間一共是3G,除了Text/Data/BSS /MemoryMapping幾個段以外,Heap和Stack空間的總量有限,是此消彼長的。所以遇到這個錯誤,能夠經過兩個途徑解決: 1.經過 -Xss啓動參數減小單個線程棧大小,這樣便能開更多線程(固然不能過小,過小會出現StackOverflowError); 2.經過-Xms -Xmx 兩參數減小Heap大小,將內存讓給Stack(前提是保證Heap空間夠用)。 【狀況六】: java.lang.StackOverflowError 【緣由】:這也內存溢出錯誤的一種,即線程棧的溢出,要麼是方法調用層次過多(好比存在無限遞歸調用),要麼是線程棧過小。 【解決】:優化程序設計,減小方法調用層次;調整-Xss參數增長線程棧大小