java线程多栈会溢出_JVM 栈(stack)溢出案例
介紹
當(dāng)啟動(dòng)一個(gè)新線程時(shí),JVM就會(huì)給這個(gè)線程分配一個(gè)Java棧(這個(gè)棧的內(nèi)存大小由-Xss參數(shù)來設(shè)置)。
一個(gè)Java棧的基本單位是幀,每一次函數(shù)調(diào)用就會(huì)生成棧幀,占用一定的??臻g。當(dāng)函數(shù)本身需要的內(nèi)存過大,或者函數(shù)調(diào)用函數(shù)(依賴調(diào)用或者遞歸調(diào)用)太深,超過了-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ù)還是有限制的,不能無限生成,經(jīng)驗(yàn)值在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。因?yàn)?StackOverflowError 不屬于 Exception 的子類。
System.out.println("Stack deep : " + deep);
e.printStackTrace();
}
// 不讓進(jìn)程結(jié)束,便于使用分析工具來查看內(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)
...
總結(jié)
以上是生活随笔為你收集整理的java线程多栈会溢出_JVM 栈(stack)溢出案例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java md5包_JAVA中有没有提供
- 下一篇: java bat 运行 jar文件_运行