1. 程式人生 > >數據結構中的堆棧和內存中的堆棧不是一回事

數據結構中的堆棧和內存中的堆棧不是一回事

進程調度 回收 常量 wol 第四章 student 方法 記錄 對象存儲

今天看《碼出高效》第四章JVM內容時,讀到JVM提供了直接控制操作棧的指令時,突然聯想到數據結構中對於棧結構的出入棧的操作。遂聯想二者之間莫非有什麽關聯,於是就查閱相關博文,記錄成文。

數據結構中的堆棧

:是一種連續存儲的數據結構,特點是存儲的數據先進後出。

:是一棵完全二叉樹結構,特點是父節點的值大於(小於)兩個子節點的值(分別稱為大頂堆和小頂堆)。它常用於管理算法執行過程中的信息,應用場景包括堆排序,優先隊列等。

內存中的堆棧

內存空間在邏輯上分為三部分:代碼區、靜態數據區和動態數據區,動態數據區又分為棧區和堆區。

代碼區:存儲方法體的二進制代碼。高級調度(作業調度)、中級調度(內存調度)、低級調度(進程調度)控制代碼區執行代碼的切換。

靜態數據區:存儲全局變量、靜態變量、常量,常量包括final修飾的常量和String常量。系統自動分配和回收。

棧區:存儲運行方法的形參、局部變量、返回值。由系統自動分配和回收。

例如 int method(int a){int b;}棧中存儲參數a、局部變量b、返回值temp。

堆區:new一個對象的引用或地址存儲在棧區,指向該對象存儲在堆區中的真實數據。由程序員分配和回收(Java中由JVM虛擬機的垃圾回收機制自動回收)。

例如 Class Student{int num; int age;} main方法中Student stu = new Student();分配堆區空間中存儲的該對象的num、age,變量stu存儲在棧中,裏面的值是對應堆區空間的引用或地址。

參考:https://blog.csdn.net/wolenski/article/details/7951961

數據結構中的堆棧和內存中的堆棧不是一回事