核心概念
棧是一種數(shù)據(jù)結(jié)構(gòu)瓢阴,可以簡單理解為桶的形狀先進(jìn)后出臭埋,后進(jìn)先出。 First In Last Out (FILO)臀玄。
桶.png
和他類似的數(shù)據(jù)結(jié)構(gòu)類型是隊(duì)列。
隊(duì)列:先進(jìn)先出健无,后進(jìn)后出
棧
棧內(nèi)存荣恐,主管程序的運(yùn)行,生命周期和線程同步累贤;線程結(jié)束叠穆,棧內(nèi)存釋放。對(duì)于棧來說臼膏,不存在垃圾回收問題硼被。一旦線程結(jié)束,棧就over渗磅。
棧主要存放:8大基本類型+方法的引用+對(duì)象的引用
棧幀
棧幀分為棧底和棧頂嚷硫,每執(zhí)行一個(gè)方法都會(huì)產(chǎn)生一個(gè)棧幀。
image.png
一個(gè)對(duì)象實(shí)例化的過程
代碼
public class StudentTest {
private String name;
private int age;
public static void main(String[] args) throws Exception {
StudentTest studentTest = new StudentTest();//第一次初始這個(gè)類(第一次加載這個(gè)類)
System.out.println("new 出來studentTest對(duì)象"+studentTest.age);
System.out.println("new 出來studentTest對(duì)象"+studentTest.name);
studentTest.testStudent();
}
void testStudent(){
this.age=15;
this.name="小余";
System.out.println("對(duì)象調(diào)用testStudent方法中"+this.age);
System.out.println("對(duì)象調(diào)用testStudent方法中"+this.name);
}
}
程序執(zhí)行到 main() 方法時(shí)始鱼,main()函數(shù)方法體會(huì)進(jìn)入棧區(qū)仔掸,這一過程叫做進(jìn)棧(壓棧)
image.png
image.png
棧內(nèi)存溢出
1.棧內(nèi)存溢出會(huì)拋出Throwable級(jí)別
的錯(cuò)誤:java.lang.StackOverflowError
2.棧內(nèi)存有兩個(gè)主要原因:
1.棧中方法太多了(壓棧過多),導(dǎo)致棧內(nèi)存溢出医清。(圖棧溢出1-1)
2.棧中方法過大起暮,導(dǎo)致棧內(nèi)存溢出(圖棧溢出1-2)
棧溢出1-1.png
代碼演示方法過多導(dǎo)致棧溢出
/**
* @PROJECT_NAME: java-jvm
* @DESCRIPTION: 棧內(nèi)存溢出demo
* @USER: 1
* @DATE: 2022/11/30 15:10
* @author: xiaoyu
*/
public class StockDemo01 {
// 定義一個(gè)類變量,用于記錄方法運(yùn)行次數(shù)
static int count;
public static void main(String[] args) {
try {
test();
}catch (Throwable e) {
e.printStackTrace();
System.out.println(count);
}
}
// 錯(cuò)誤的無限遞歸会烙,進(jìn)行壓棧
static void test(){
count++;
test();
}
}
棧溢出1-2.png