栈溢出
這節(jié)課我們講一下棧溢出,棧溢出主要是在做遞歸調(diào)用的時候,循環(huán)定義的情況下,可能會發(fā)生一個棧溢出的一個問題,就是拋出棧異常,也就是一個最大的深度
package com.learn.test;/*** 棧溢出* 這個你默認的話不一樣的* 最大深度可能跟每個的配置是不一樣的* 這個你無法去說的* 我記得是1萬2千多* 具體數(shù)字我也忘記了* 我們看一下默認深度是多少* 這是默認的* * @author Leon.Sun**/
public class Test005 {private static int count;public static void count() {try {/*** 在count方法里面做了count++;*/count++;/*** 然后又調(diào)了count方法* 這個叫做什么方法* 這個叫做什么調(diào)用* 遞歸方法一直在循環(huán)調(diào)用* */
// count();} catch (Throwable e) {/*** 在這里我們也把日志給打印出來了* 他最多最大的深度是為多少* 最大深度:10692* java.lang.StackOverflowError* 報了這個異常為什么* 10692的最大深度* 如果你想再調(diào)用更深的可以有一個配置的* 你們可以去加大深度調(diào)用* 我們需要配置這樣一段話就行了* 默認深度你不能說具體的* 每個電腦的運行效果不一樣的* 所以這個不好說* 只能說大概是多少* 默認深度是10692* 我們可以加大他的深度調(diào)用* 我們同樣進行配置* Run as -> Run Application -> VM arguments* -Xss5m* 最大深度:252212* 只要我配置5M,* 這個深度是他的多少倍* 基本上是20多倍* 默認1M能調(diào)多少深度* -Xss1m* 最大深度:10694* 1M的情況下是10694* 大概我們的默認深度是1M* 在這里給你說一個誤區(qū)* */System.out.println("最大深度:" + count);e.printStackTrace();}}public static void main(String[] args) {/*** 這里有一個count方法*/
// count();/*** 我在這里寫一個for循環(huán)* 我這么調(diào)用會不會產(chǎn)生棧溢出的問題* 這叫不叫遞歸調(diào)用* 會不會產(chǎn)生棧溢出的問題* 這個不是遞歸* 遞歸里面才會產(chǎn)生的* 這個肯定不會的* 沒有報任何錯吧* 然后我把它加大一倍* 是不是也沒有報錯* 是肯定不會的* 棧采用遞歸調(diào)用的情況下* 棧溢出是產(chǎn)生于遞歸調(diào)用* 循環(huán)遍歷是不會的*/for (int i = 0; i < 20805; i++) {count();}}
}
虛擬機棧溢出
錯誤原因: java.lang.StackOverflowError 棧內(nèi)存溢出
棧溢出 產(chǎn)生于遞歸調(diào)用,循環(huán)遍歷是不會的,但是循環(huán)方法里面產(chǎn)生遞歸調(diào)用, 也會發(fā)生棧溢出。
解決辦法:設置線程最大調(diào)用深度
-Xss5m 設置最大調(diào)用深度
?
總結
- 上一篇: jvm解决堆内存溢出问题
- 下一篇: 内存溢出与内存泄漏区别