摘要:如果設(shè)置的太小可能會(huì)很容易出現(xiàn)異常。以后每個(gè)線程堆棧大小為,以前每個(gè)線程堆棧大小為。示例代碼通過(guò)無(wú)限遞歸來(lái)模擬棧溢出捕獲的是,而不是。不讓進(jìn)程結(jié)束,便于使用分析工具來(lái)查看內(nèi)存情況執(zhí)行結(jié)果
介紹
當(dāng)啟動(dòng)一個(gè)新線程時(shí),JVM就會(huì)給這個(gè)線程分配一個(gè)Java棧(這個(gè)棧的內(nèi)存大小由-Xss參數(shù)來(lái)設(shè)置)。
一個(gè)Java棧的基本單位是幀,每一次函數(shù)調(diào)用就會(huì)生成棧幀,占用一定的??臻g。當(dāng)函數(shù)本身需要的內(nèi)存過(guò)大,或者函數(shù)調(diào)用函數(shù)(依賴調(diào)用或者遞歸調(diào)用)太深,超過(guò)了-Xss設(shè)置的內(nèi)存大小,就會(huì)拋出StackOverflowError異常。
-Xss:默認(rèn)值 1M,控制每個(gè)線程占用的內(nèi)存,這個(gè)參數(shù)決定了函數(shù)調(diào)用的最大深度。如果設(shè)置的太小可能會(huì)很容易出現(xiàn) StackOverflowError 異常。示例代碼JDK 5.0以后每個(gè)線程堆棧大小為1M,以前每個(gè)線程堆棧大小為256K。在相同物理內(nèi)存下,減小這個(gè)值能生成更多的線程。但是操作系統(tǒng)對(duì)一個(gè)進(jìn)程內(nèi)的線程數(shù)還是有限制的,不能無(wú)限生成,經(jīng)驗(yàn)值在3000~5000左右。
public class StackOverflow { private static int deep = 1; /** * 通過(guò)無(wú)限遞歸來(lái)模擬棧溢出 */ private static void recursion() { deep++; recursion(); } public static void main(String[] args) { try { recursion(); } catch (Throwable e) { // catch 捕獲的是 Throwable,而不是 Exception。因?yàn)?StackOverflowError 不屬于 Exception 的子類。 System.out.println("Stack deep : " + deep); e.printStackTrace(); } // 不讓進(jìn)程結(jié)束,便于使用分析工具來(lái)查看內(nèi)存情況 try { Thread.sleep(24 * 60 * 60 * 1000); } catch (InterruptedException e) { e.printStackTrace(); } } }
執(zhí)行結(jié)果
Stack deep : 11429 java.lang.StackOverflowError at com.song.StackOverflow.call(StackOverflow.java:16) at com.song.StackOverflow.call(StackOverflow.java:17) ...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/75126.html
摘要:內(nèi)存溢出分配的內(nèi)存空間超過(guò)系統(tǒng)內(nèi)存。內(nèi)存泄漏的原因分析由大塊組成堆,棧,本地方法棧,程序計(jì)數(shù)器,方法區(qū)。內(nèi)存溢出的原因分析內(nèi)存溢出是由于沒(méi)被引用的對(duì)象垃圾過(guò)多造成沒(méi)有及時(shí)回收,造成的內(nèi)存溢出。小結(jié)棧內(nèi)存溢出程序所要求的棧深度過(guò)大導(dǎo)致。 showImg(https://segmentfault.com/img/bVbweuq?w=563&h=300); 前言:JVM中除了程序計(jì)數(shù)器,其他...
摘要:內(nèi)存溢出的情況就是從類加載器加載的時(shí)候開(kāi)始出現(xiàn)的,內(nèi)存溢出分為兩大類和。以下舉出個(gè)內(nèi)存溢出的情況,并通過(guò)實(shí)例代碼的方式講解了是如何出現(xiàn)內(nèi)存溢出的。內(nèi)存溢出問(wèn)題描述元空間的溢出,系統(tǒng)會(huì)拋出。這樣就會(huì)造成棧的內(nèi)存溢出。 導(dǎo)言: 對(duì)于java程序員來(lái)說(shuō),在虛擬機(jī)自動(dòng)內(nèi)存管理機(jī)制的幫助下,不需要自己實(shí)現(xiàn)釋放內(nèi)存,不容易出現(xiàn)內(nèi)存泄漏和內(nèi)存溢出的問(wèn)題,由虛擬機(jī)管理內(nèi)存這一切看起來(lái)非常美好,但是一旦...
摘要:編譯參見(jiàn)深入理解虛擬機(jī)節(jié)走進(jìn)之一自己編譯源碼內(nèi)存模型運(yùn)行時(shí)數(shù)據(jù)區(qū)域根據(jù)虛擬機(jī)規(guī)范的規(guī)定,的內(nèi)存包括以下幾個(gè)運(yùn)運(yùn)行時(shí)數(shù)據(jù)區(qū)域程序計(jì)數(shù)器程序計(jì)數(shù)器是一塊較小的內(nèi)存空間,他可以看作是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器。 點(diǎn)擊進(jìn)入我的博客 1.1 基礎(chǔ)知識(shí) 1.1.1 一些基本概念 JDK(Java Development Kit):Java語(yǔ)言、Java虛擬機(jī)、Java API類庫(kù)JRE(...
摘要:第章內(nèi)存區(qū)域與內(nèi)存溢出異常運(yùn)行時(shí)數(shù)據(jù)區(qū)域虛擬機(jī)在執(zhí)行程序的過(guò)程中會(huì)把它所管理的內(nèi)存劃分為若干個(gè)不同的數(shù)據(jù)區(qū)域。即對(duì)象指向它的類元數(shù)據(jù)的指針,虛擬機(jī)通過(guò)這個(gè)指針來(lái)確定這個(gè)對(duì)象是哪個(gè)類的實(shí)例。 第2章 Java內(nèi)存區(qū)域與內(nèi)存溢出異常 2.2 運(yùn)行時(shí)數(shù)據(jù)區(qū)域 Java虛擬機(jī)在執(zhí)行Java程序的過(guò)程中會(huì)把它所管理的內(nèi)存劃分為若干個(gè)不同的數(shù)據(jù)區(qū)域。根據(jù)《Java虛擬機(jī)規(guī)范(Java SE 7版)...
摘要:垃圾回收垃圾檢測(cè)引用計(jì)數(shù)法和可達(dá)性分析算法。引用計(jì)數(shù)法給一個(gè)對(duì)象添加引用計(jì)數(shù)器,每當(dāng)有個(gè)地方引用它,計(jì)數(shù)器就加,引用失效就減。通常會(huì)在老年代內(nèi)存被占滿時(shí)將會(huì)觸發(fā),回收整個(gè)堆內(nèi)存。 基礎(chǔ)知識(shí) JVM - HotSpot內(nèi)存布局(1.8之前版本) showImg(https://segmentfault.com/img/bVMdE6?w=1024&h=608); 1.8版本開(kāi)始,持久區(qū)沒(méi)有...
閱讀 3729·2023-04-25 17:45
閱讀 3438·2021-09-04 16:40
閱讀 1005·2019-08-30 13:54
閱讀 2137·2019-08-29 12:59
閱讀 1407·2019-08-26 12:11
閱讀 3284·2019-08-23 15:17
閱讀 1526·2019-08-23 12:07
閱讀 3888·2019-08-22 18:00