JVM從頭學(一)—— 堆棧與JVM內存模型
- 2019 年 10 月 30 日
- 筆記
堆棧數據結構
堆
堆的數據結構是一個完全二叉樹,一般使用於優先隊列。堆分大數堆和小數堆,大數堆是大數在父節點,小數,小數堆是小數在子節點。每次排序後的次數也有限,插入排序的次數是數的層數減一,就是O(log2n),初始化的時間複雜度是O(n),消費最大/最小節點的時間複雜度是O(log2n)。消費父節點的算法是,刪掉父節點,用最後一個節點重頂節點做插入算法。
棧
棧是一種數據結構,後進先出。
堆棧
用堆排序的方式的棧。永遠出棧頂,也就是永遠出最大、最小值。
java內存模型
JVM是java虛擬機。它把內存分為,寄存器,本地方法區,方法區,棧內存,堆內存。
方法區
方法區存的都是程序唯一的,靜態的,所有線程共用的對象,如class對象,static對象
。
棧內存存的是引用,基本類型對象。堆存的是數組和實體對象。棧對象的引用的地址就是堆的地址。棧的生命周期很短,一旦對象離開生命周期,就在棧中清除該數據。堆中的對象沒有引用,就會被標記為垃圾對象,等待GC。
---------------------- ------------------- | Integer a = OX2312 | ---> | new Integet(18) | ---------------------- | 地址:OX2312 | 棧 --------------------
注意,字符串存在字符串池中,不是棧,也不在堆,在方法區,即使字符串池中的字符串沒有引用,也不會GC。
如String a = "123";
,JVM會在棧中創建引用a,在字符串池中找到是否有」123」這個字符串,如果有,就把地址直接賦予a,如果沒有,在字符串池中創建」123」,並把地址賦予a。
如String a = new String("123");
,JVM會在棧中創建引用a,並比較字符串池中是否存在,不存在便創建,同時在堆中創建一個」123」的對象,把堆的地址賦予引用a。