Java記憶體地區與記憶體溢出異常,java地區溢出

來源:互聯網
上載者:User

Java記憶體地區與記憶體溢出異常,java地區溢出

1,java堆溢出

    JAVA堆用於儲存物件執行個體,只要不斷的建立對象,保證GC Roots到對象直接有可達路徑,避免記憶體回收機制清楚對象,那麼對象數量叨叨一定程度後,會產生記憶體溢出異常。

    如下代碼,限制Java堆大小為1024m,並且-Xms和-Xmx的參數相同,即不可擴充。同事在Run Configuration中增加VM 參數:

 
  1. -XX:+HeapDumpOnOutOfMemoryError

讓虛擬機器在出現記憶體溢出異常時,Dump出當前的記憶體堆轉儲快照。

 
  1. package com.jvm.exception;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. public class HeapSpaceException {
  5. public static void main(String[] args) {
  6. List<byte[]> byteList = new ArrayList<byte[]>();
  7. while(true){
  8. byteList.add(new byte[1024]);
  9. }
  10. }
  11. }

運行結果:

 
  1. java.lang.OutOfMemoryError: Java heap space
  2. Dumping heap to java_pid2783.hprof ...
  3. Heap dump file created [3795151132 bytes in 3.289 secs]
  4. Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
  5. at com.jvm.exception.HeapSpaceException.main(HeapSpaceException.java:13)

記憶體中首先提示OutOfMemoryError,讓後提升Java heap space。

    一般出現此類問題,可以採用記憶體分析工具,如Eclipse Memory Analyzer進行分析。

    如果記憶體泄露,則查看泄露對象到GC Roots的引用鏈,確定記憶體泄露位置。

    如果記憶體未泄露,則應當檢查虛擬機器的參數(-Xmx 和 -Xms)。

2,虛擬機器棧和本地方法棧溢出

    由於HotSpot虛擬機器並沒有區分虛擬機器棧和本地方法棧,因此對HotSpot來說,-Xoss(設定本地方法棧大小)參數存在,但實際是無效的。棧容量只能通過-Xss參數設定。虛擬機器棧和本地方法棧,在Java虛擬機器規範中定義了兩種異常:

    -1,如果線程請求棧深度大於虛擬機器所允許的最大深度,將拋出StackOverFlowError異常。

    -2,如果虛擬機器找擴充棧時無法申請到足夠的記憶體空間,則拋出OutOfMmemoryError。

首先在單線程環境中,使用-Xss參數減少棧記憶體容量,拋出StackOverFlowError。

 
  1. package com.jvm.exception;
  2. /**
  3. * 預設-Xss參數
  4. * @author jinglongjun
  5. *
  6. */
  7. public class StackOverFlowError {
  8. private int stackLength = 1;
  9. public void stackLeak(){
  10. stackLength ++;
  11. stackLeak();
  12. }
  13. public static void main(String[] args) {
  14. StackOverFlowError sof = new StackOverFlowError();
  15. try{
  16. sof.stackLeak();
  17. }catch(Throwable e){
  18. System.out.println("stackLength : " + sof.stackLength);
  19. throw e;
  20. }
  21. }
  22. }

輸出內容:

 
  1. stackLength : 10828
  2. Exception in thread "main" java.lang.StackOverflowError
  3. at com.jvm.exception.StackOverFlowError.stackLeak(StackOverFlowError.java:13)
  4. at com.jvm.exception.StackOverFlowError.stackLeak(StackOverFlowError.java:14)

單線程環境,定義大量本地變數,增大方法棧中本地變數表的長度。結果拋出StackOverFlowEoor時,輸出的堆棧深度相應的縮小。

這種情況類比了很久沒有類比出來。因為本文是參考《深入理解Java虛擬機器》這本書的,書中也未給出例子。

在單線程下,總是拋出StackOverFlowError。

多線程類比。

建議不要嘗試運行下面的代碼。

建議不要嘗試運行下面的代碼。

建議不要嘗試運行下面的代碼。

 
  1. package com.jvm.exception;
  2. public class OutOfMemoryError {
  3. public void dontStop(){
  4. while(true){
  5. }
  6. }
  7. public void stackLengthThread(){
  8. while(true){
  9. Thread thread = new Thread(new Runnable() {
  10. @Override
  11. public void run() {
  12. dontStop();
  13. }
  14. });
  15. thread.start();
  16. }
  17. }
  18. public static void main(String[] args) {
  19. OutOfMemoryError oome = new OutOfMemoryError();
  20. oome.stackLengthThread();
  21. }
  22. }

以上代碼會拋出:

    OutOfMemoryError。

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.