1. 程式人生 > 實用技巧 >段許可權檢查,段保護機制

段許可權檢查,段保護機制

一、概述

棧是執行時的單位,堆是儲存的單位。
即:棧解決程式的執行問題,即程式如何執行,或者說如何處理資料。堆解決的是資料儲存的問題,即資料怎麼放,放在哪。
在這裡插入圖片描述
執行時資料區整體結構:
在這裡插入圖片描述

二、虛擬機器棧基本內容

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異常。
    舉例:
    遞迴呼叫,不停的壓棧導致超過虛擬機器棧最大的記憶體。
    在這裡插入圖片描述