性能測試內存異常處理

堆內存溢出

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
原因:內存不足,GC爲了釋放很小空間而佔用大量時間時拋出異常
解決:
  1、查看系統是否有使用大內存的代碼或死循環;
  2、通過添加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時就會被放到老年代,GC在主程序運行期間不會對老年代進行清理,默認是64M大小,當程序需要加載的對象比較多時,超過64M就會報這部分內存溢出了,需要加大內存分配,一般128m足夠
  
java.lang.OutOfMemoryError: Direct buffer memory
 

原因:棧溢出,方法調用層次過多或者線程棧太小。
解決:優化程序設計,減少方法調用層次;調整-Xss參數增加線程棧大小。

調整-XX:MaxDirectMemorySize= 參數 

< jvm-arg>-XX:MaxDirectMemorySize=128m< /jvm-arg> 

java.lang.OutOfMemoryError:PermGen space


Java異常


Throwable
Throwable是 Java 語言中所有錯誤或異常的超類。
Throwable包含兩個子類: Error 和 Exception 。它們指示發生了異常情況
Throwable包含了其線程創建時線程執行堆棧的快照,它提供了printStackTrace()等接口用於獲取堆棧跟蹤數據等信息


Exception
Exception及其子類是 Throwable 的一種形式,它指出了合理的應用程序想要捕獲的條件


RuntimeException
RuntimeException是那些可能在 Java 虛擬機正常運行期間拋出的異常的超類。

Error
和Exception一樣, Error也是Throwable的子類。 它用於指示合理的應用程序不應該試圖捕獲的嚴重問題,大多數這樣的錯誤都是異常條件。

Java將可拋出(Throwable)的結構分爲三種類型:

  • 被檢查的異常(Checked Exception),
  • 運行時異常(RuntimeException)
  • 錯誤(Error)


(01) 運行時異常
定義 : RuntimeException及其子類都被稱爲運行時異常
特點 : Java編譯器不會檢查它。 也就是說,當程序中可能出現這類異常時,倘若既”沒有通過throws聲明拋出它”,也”沒有用try-catch語句捕獲它”,還是會編譯通過。例如,除數爲零時產生的ArithmeticException異常,數組越界時產生的IndexOutOfBoundsException異常,fail-fail機制產生的ConcurrentModificationException異常等,都屬於運行時異常。

(02) 被檢查的異常
定義 : Exception類本身,以及Exception的子類中除了”運行時異常”之外的其它子類都屬於被檢查異常。
特點 : Java編譯器會檢查它。 此類異常,要麼通過throws進行聲明拋出,要麼通過try-catch進行捕獲處理,否則不能通過編譯。例如,CloneNotSupportedException就屬於被檢查異常。當通過clone()接口去克隆一個對象,而該對象對應的類沒有實現Cloneable接口,就會拋出CloneNotSupportedException異常。
被檢查異常通常都是可以恢復的


(03) 錯誤
定義 : Error類及其子類
特點 : 和運行時異常一樣,編譯器也不會對錯誤進行檢查。
當資源不足、約束失敗、或是其它程序無法繼續運行的條件發生時,就產生錯誤。程序本身無法修復這些錯誤的。例如,VirtualMachineError就屬於錯誤。

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