段許可權檢查,段保護機制
阿新 • • 發佈:2020-10-10
一、概述
棧是執行時的單位,堆是儲存的單位。
即:棧解決程式的執行問題,即程式如何執行,或者說如何處理資料。堆解決的是資料儲存的問題,即資料怎麼放,放在哪。
執行時資料區整體結構:
二、虛擬機器棧基本內容
Java虛擬機器棧是什麼
java虛擬機器棧,早期也叫java棧,每個執行緒在建立的時候都會建立一個虛擬機器棧,其內部儲存一個個的棧幀(stack frame),一個棧幀對應一個java方法,一次次的方法呼叫對應著一個個棧幀的進棧和出棧。
與PC寄出去一樣是執行緒私有的。
最上面的棧幀表示當前方法,當methodB()呼叫結束後,methodA()成為當前方法。
當呼叫方法時,棧幀入棧,當方法呼叫結束時,棧幀出棧。
生命週期與執行緒一致。
作用
主管Java程式的執行,參與方法的呼叫和返回,並儲存方法的區域性變數(8種基本型別、引用型別變數的地址(物件的引用地址))、部分結果(方法執行過程中的一些中間運算結果)。
- 按照作用域分為:區域性變數和成員變數(類的域)
- 按照資料型別分為:基本資料變數和引用型別變數(陣列、類、介面)
棧的特點(優點) - 棧是一種快速有效的分配儲存方式,訪問速度僅次於程式計數器。
- JVM直接對Java棧的操作只有兩個。
進棧:每個方法執行,伴隨著進棧(入棧、壓棧)
出棧:執行結束後的出棧工作 - 對於棧來說不存在垃圾回收的問題
GC、可能存在OOM、Stack over flow
棧頂幀就是當前方法。
三、棧中可能出現的異常
Java虛擬機器規範中允許Java棧的大小是動態的或者固定不變的。
- 如果採用固定大小的java虛擬機器棧,那每一個執行緒的Java虛擬機器棧容量可以線上程建立的時候獨立選定。如果執行緒請求分配的棧容量(執行過程中不斷的遞迴等,不停的進行入棧操作)超過Java虛擬機器棧允許的最大容量,java虛擬機器會丟擲一個StackOverFlowError異常。
- 如果java虛擬機器棧可以動態擴充套件,並且在嘗試擴充套件的時候無法申請到足夠的記憶體,或者在建立新的執行緒時沒有足夠的記憶體去建立虛擬機器棧,那java虛擬機器將會丟擲一個OutOfMemoryError異常。
舉例:
遞迴呼叫,不停的壓棧導致超過虛擬機器棧最大的記憶體。