国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java虛擬機常見內存溢出錯誤匯總

Java虛擬機常見內存溢出錯誤匯總

2020-09-13 00:03RedMushroom Java教程

這篇文章主要匯總了Java虛擬機常見的內存溢出錯誤,警示大家,避免出錯,感興趣的朋友可以了解下

一、引言

從事java開發的小伙伴在平時的開發工作中,應該會遇見各式各樣的異常和錯誤,在實際工作中積累的異常或者錯誤越多,趟過的坑越多,就會使我們編碼更加的健壯,就會本能地避開很多嚴重的坑。以下介紹幾個Java虛擬機常見內存溢出錯誤。以此警示,避免生產血案。

二、模擬Java虛擬機常見內存溢出錯誤

1、內存溢出之棧溢出錯誤

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.jayway.oom;
 
/**
 * 棧溢出錯誤
 * 虛擬機參數:-Xms10m -Xmx10m
 * 拋出異常:Exception in thread "main" java.lang.StackOverflowError
 */
 public class StackOverflowErrorDemo {
 
 public static void main(String[] args) {
  stackOverflowError();
 }
 
 private static void stackOverflowError() {
  stackOverflowError();
 }
 
}

2、內存溢出之堆溢出錯誤

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.jayway.oom;
 
import java.util.Random;
 
/**
 * 堆溢出錯誤
 * 虛擬機參數:-Xmx10m -Xms10m
 * 拋出異常:Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
 */
 public class JavaHeapSpaceErrorDemo {
 
 public static void main(String[] args) {
  String temp = "java";
  //不斷地在堆中開辟空間,創建對象,撐爆堆內存
  while (true) {
    temp += temp + new Random().nextInt(111111111) + new Random().nextInt(222222222);
    temp.intern();
  }
 }
}

3、內存溢出之GC超過執行限制錯誤

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package com.jayway.oom;
 
import java.util.ArrayList;
import java.util.List;
 
/**
 * GC超過執行限制錯誤
 * 虛擬機參數:-Xms10m -Xmx10m -XX:+PrintGCDetails -XX:MaxDirectMemorySize=5m
 * * 拋出異常:Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
 * * 導致原因:GC回收時間過長會拋出OutOfMemoryError,何為過長,即超過98%的cpu時間用來做GC垃圾回收
 * 但是回收效果甚微,僅僅只有2%的CPU時間用來用戶程序的工作,這種狀態是很糟糕的,程序在不斷地GC
 * 形成惡性循環,CPU的使用率一直是滿負荷的,正經活卻沒有干,這種情況虛擬機只好拋出錯誤來終止程序的執行
 *
 * 不斷地Full GC,事倍功微
 * [Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7167K->7161K(7168K)] 9215K->9209K(9728K), [Metaspace: 3529K->3529K(1056768K)], 0.0291829 secs] [Times: user=0.08 sys=0.02, real=0.03 secs]
 */
 public class GCOverheadErrorDemo {
 
  public static void main(String[] args) {
    int i = 0;
    List<String> list = new ArrayList<>();
    try {
      while (true) {
      list.add(String.valueOf(++i).intern());
      }
    } catch (Throwable e) {
      System.out.println("*****************i:" + i);
      e.printStackTrace();
      throw e;
    }
  }
}

4、內存溢出之直接內存溢出錯誤

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package com.jayway.oom;
 
import java.nio.ByteBuffer;
 
/**
 * 直接內存溢出錯誤
 * 拋出異常:Exception in thread "main" java.lang.OutOfMemoryError: Direct buffer memory
 * * 配置虛擬機參數:-Xms10m -Xmx10m -XX:+PrintGCDetails -XX:MaxDirectMemorySize=5m
 * * 導致原因:通常NIO程序經常使用ByteBuffer來讀取或者寫入數據,這是一種基于通道(Channel)與緩沖區(Buffer)的IO方式,
 * 它可以使用Native函數庫直接分配堆外內存,然后通過一個存儲在java堆里面的DirectByteBuffer對象作為這塊內存的引用,
 * 這樣能子一些場景中顯著提高性能,因為避免了在Java堆和Native內存中來回復制數據。
 *
 * ByteBuffer.allocate(capability):分配JVM堆內存,數據GC的管轄范圍,由于需要拷貝所以速度相對較慢
 *
 * ByteBuffer.allocate(capability):分配OS本地內存,不屬于GC管轄范圍,由于不需要內存拷貝,所以速度相對較快。
 *
 * 但是如果不斷分配本地內存,堆內存很少使用,那么JVM就不需要執行GC,DirectByteBuffer對象就不會被回收,此時如果繼續分配堆外內存,
 * 可能堆外內存已經被耗光了無法繼續分配,此時程序就會拋出OutOfMemoryError,直接崩潰。
 *
 */
 public class DirectBufferMemoryErrorDemo {
 
  public static void main(String[] args) {
    //默認JVM配置的最大直接內存是總物理內存的四分之一
    long maxDirectMemory = sun.misc.VM.maxDirectMemory() / 1024 / 1024;
    System.out.println("配置的maxDirectMemory:" + maxDirectMemory + "MB");
 
    ByteBuffer byteBuffer = ByteBuffer.allocateDirect(6 * 1024 * 1024);
  }
 
}

5、內存溢出之無法創建新的本地線程

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.jayway.oom;
 
/**
 * 內存溢出之無法創建新的本地線程
 * 拋出異常:java.lang.OutOfMemoryError: unable to create new native thread
 * * 描述:
 * 高并發請求服務器時,經常出現java.lang.OutOfMemoryError: unable to create new native thread
 *   native thread異常與對應的平臺有關
 *
 * 導致原因:
 *   1、應用程序創建了太多線程了,一個應用進程創建的線程數超過系統承載極限。
 *   2、操作系統并不允許你的應用進程創建這么多的線程,linux系統默認允許單個進程可以創建的線程數是1024個
 *
 * 解決方法:
 *   1、想辦法降低應用進程創建的線程數量,
 *   2、如果應用程序確實需要這么多線程,超過了linux系統的默認1024個限制,可以通過修改linux服務器配置,提高這個閾值。
 *
 */
 public class UnableCreateNativeThreadErrorDemo {
 
  public static void main(String[] args) {
    for (int i = 0; true; i++) {
      System.out.println("***************i:" + i);
 
      //不斷得創建新線程,直到超過操作系統允許應用進程創建線程的極限
      new Thread(() -> {
        try {
          Thread.sleep(Integer.MAX_VALUE);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
      }).start();
    }
  }
}

6、內存溢出之元空間溢出錯誤

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package com.jayway.oom;
 
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
 
import java.lang.reflect.Method;
 
/**
 * 元空間溢出錯誤
 * 拋出異常:java.lang.OutOfMemoryError: Metaspace
 * * 設置虛擬機參數:-XX:MetaspaceSize=8m -XX:MaxMetaspaceSize=8m
 * * 描述:Java8及以后的版本使用Metaspace來替代了永久代。metaspace是方法區在HotSpot中的實現,它與持久代最大的區別在于
 *   Metaspace并不在虛擬機內存中而是在本地內存中。
 *
 * 元空間存儲了以下信息:
 *   1、虛擬機加載的類信息
 *   2、常量池
 *   3、靜態變量
 *   4、即時編譯后的代碼
 *
 */
 public class MetaspaceErrorDemo {
 
  static class OOMTest {
  }
 
  public static void main(String[] args) {
    int count = 0;
 
    try {
    //cglib不斷創建類,模擬Metaspace空間溢出,我們不斷生成類往元空間中灌,超過元空間大小后就會拋出元空間移除的錯誤
      while (true) {
        count++;
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(OOMTest.class);
        enhancer.setUseCache(false);
        enhancer.setCallback(new MethodInterceptor() {
          @Override
          public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
            return methodProxy.invokeSuper(o, args);
          }
        });
        enhancer.create();
      }
    } catch (Throwable e) {
      System.out.println("************多少次后發生了異常:" + count);
      e.printStackTrace();
    }
  }
}

以上就是Java虛擬機常見內存溢出錯誤匯總的詳細內容,更多關于Java虛擬機內存溢出的資料請關注服務器之家其它相關文章!

原文鏈接:https://segmentfault.com/a/1190000024433630

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产欧美精品一区二区三区 | 国产一区二区免费 | 日韩色网 | 国产成人一区二区三区 | 国产精品一区二区三区免费视频 | 国产自产高清不卡 | www.国产一区 | 国产精品久久久久久久午夜片 | 任你躁久久久久久妇女av | 人人超碰免费 | 久久亚洲精品裙底抄底 | 欧美日韩国产在线播放 | 国产片av在线永久免费观看 | 欧美a在线看 | 一级毛片免费播放 | 国产成人在线一区二区 | 在线国产一区二区 | 日本欧美在线观看 | 成人免费av | 国产一区高清 | 久久与欧美 | 毛片网免费| 亚洲电影在线观看 | 色站综合 | 人人玩人人添人人澡97 | 黄色一区二区三区 | 一区二区三区四区日韩 | 精品成人在线视频 | 在线成人av | 婷婷五月色综合香五月 | 午夜精品福利在线观看 | 成人国产精品久久久 | 亚洲欧美日韩精品久久奇米色影视 | 99在线播放 | 色噜噜狠狠狠综合曰曰曰 | 黄网站涩免费蜜桃网站 | 亚洲一区二区美女 | 日韩中文字幕无码一区二区三区 | 亚洲国产精品久久久 | 色九九 | 国产成人黄色av |