国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JVM 棧(stack)溢出案例

ConardLi / 2138人閱讀

摘要:如果設置的太小可能會很容易出現異常。以后每個線程堆棧大小為,以前每個線程堆棧大小為。示例代碼通過無限遞歸來模擬棧溢出捕獲的是,而不是。不讓進程結束,便于使用分析工具來查看內存情況執行結果

介紹

當啟動一個新線程時,JVM就會給這個線程分配一個Java棧(這個棧的內存大小由-Xss參數來設置)。

一個Java棧的基本單位是幀,每一次函數調用就會生成棧幀,占用一定的棧空間。當函數本身需要的內存過大,或者函數調用函數(依賴調用或者遞歸調用)太深,超過了-Xss設置的內存大小,就會拋出StackOverflowError異常。

-Xss:默認值 1M,控制每個線程占用的內存,這個參數決定了函數調用的最大深度。如果設置的太小可能會很容易出現 StackOverflowError 異常。    

JDK 5.0以后每個線程堆棧大小為1M,以前每個線程堆棧大小為256K。在相同物理內存下,減小這個值能生成更多的線程。但是操作系統對一個進程內的線程數還是有限制的,不能無限生成,經驗值在3000~5000左右。

示例代碼
public class StackOverflow {

    private static int deep = 1;

    /**
     * 通過無限遞歸來模擬棧溢出
     */
    private static void recursion() {
        deep++;
        recursion();
    }

    public static void main(String[] args) {
        try {
            recursion();
        } catch (Throwable e) { // catch 捕獲的是 Throwable,而不是 Exception。因為 StackOverflowError 不屬于 Exception 的子類。
            System.out.println("Stack deep : " + deep);
            e.printStackTrace();
        }

        // 不讓進程結束,便于使用分析工具來查看內存情況
        try {
            Thread.sleep(24 * 60 * 60 * 1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

執行結果

Stack deep : 11429
java.lang.StackOverflowError
    at com.song.StackOverflow.call(StackOverflow.java:16)
    at com.song.StackOverflow.call(StackOverflow.java:17)
    ...

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75126.html

相關文章

  • 關于JVM內存溢出的原因分析及解決方案探討

    摘要:內存溢出分配的內存空間超過系統內存。內存泄漏的原因分析由大塊組成堆,棧,本地方法棧,程序計數器,方法區。內存溢出的原因分析內存溢出是由于沒被引用的對象垃圾過多造成沒有及時回收,造成的內存溢出。小結棧內存溢出程序所要求的棧深度過大導致。 showImg(https://segmentfault.com/img/bVbweuq?w=563&h=300); 前言:JVM中除了程序計數器,其他...

    xuexiangjys 評論0 收藏0
  • 十種JVM內存溢出的情況,你碰到過幾種?

    摘要:內存溢出的情況就是從類加載器加載的時候開始出現的,內存溢出分為兩大類和。以下舉出個內存溢出的情況,并通過實例代碼的方式講解了是如何出現內存溢出的。內存溢出問題描述元空間的溢出,系統會拋出。這樣就會造成棧的內存溢出。 導言: 對于java程序員來說,在虛擬機自動內存管理機制的幫助下,不需要自己實現釋放內存,不容易出現內存泄漏和內存溢出的問題,由虛擬機管理內存這一切看起來非常美好,但是一旦...

    ShevaKuilin 評論0 收藏0
  • JVM詳解1.Java內存模型

    摘要:編譯參見深入理解虛擬機節走進之一自己編譯源碼內存模型運行時數據區域根據虛擬機規范的規定,的內存包括以下幾個運運行時數據區域程序計數器程序計數器是一塊較小的內存空間,他可以看作是當前線程所執行的字節碼的行號指示器。 點擊進入我的博客 1.1 基礎知識 1.1.1 一些基本概念 JDK(Java Development Kit):Java語言、Java虛擬機、Java API類庫JRE(...

    TANKING 評論0 收藏0
  • 摘記《深入理解Java虛擬機:JVM高級特性與最佳實踐(第2版)》

    摘要:第章內存區域與內存溢出異常運行時數據區域虛擬機在執行程序的過程中會把它所管理的內存劃分為若干個不同的數據區域。即對象指向它的類元數據的指針,虛擬機通過這個指針來確定這個對象是哪個類的實例。 第2章 Java內存區域與內存溢出異常 2.2 運行時數據區域 Java虛擬機在執行Java程序的過程中會把它所管理的內存劃分為若干個不同的數據區域。根據《Java虛擬機規范(Java SE 7版)...

    zoomdong 評論0 收藏0
  • jvm調優

    摘要:垃圾回收垃圾檢測引用計數法和可達性分析算法。引用計數法給一個對象添加引用計數器,每當有個地方引用它,計數器就加,引用失效就減。通常會在老年代內存被占滿時將會觸發,回收整個堆內存。 基礎知識 JVM - HotSpot內存布局(1.8之前版本) showImg(https://segmentfault.com/img/bVMdE6?w=1024&h=608); 1.8版本開始,持久區沒有...

    jemygraw 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<