JVM(二)記憶體區域

2022-06-29 16:33:11 字數 1371 閱讀 6507

​ 堆總被分為兩個部分:新生代和老年代,其中新生代中又被分為eden區和survivor區,survivor區由form survivor和to survivor組成(具體的gc、物件分配方面會在後面的文章講到)。

​ 在棧幀中一般來說兩個棧幀是不會相互有關係的,都是獨立存在的。但是在某些情況下,會使兩個獨立的棧幀會有乙個共享的資料區,此行為為棧的優化。

​ 此時50就是main方法運算元棧的資料,同時也是add棧幀的區域性變數表中的資料。此情況為棧優化。

jhsdb詳情

​ 在string原始碼中可以看到string是被final所修飾的,它的底層為char陣列同時也是被final所修飾。因此可以知道string一旦被賦值後就不可被更改,那麼這樣做的話會有什麼好處呢?

​ (1)保證了string物件的安全性。

​ (2)保證它的hash值不會被頻繁變動,使得hashmap容器才能實現k-v的快取實現。

​ (3)可以實現字串常量。

string建立方式

string str = "abc";

//此方法建立的話,首先會去常量池中查詢是否存在abc這個常量,有的話就直接返回引用,沒有就建立。

string str1 = new string("abc");

//這個方法比起上面,在堆中多了乙個string物件,而這個string物件則指向常量池中的abc常量,所以str1首先指向的是堆中string物件而不是常量池中的abc。

public class student

}//此地的字元不會被存放在字串常量池中,只會被存在的堆中。

string str2 = "a" + "b" + "c";

//這個在目前的主流編譯器在被編譯的時候會被優化成 string str2 = "abc"。以前則會生成 a、b、c、ab、abc這幾個物件。

string str1 = new string("abc").intern();

//在物件中呼叫intern方法,會和 string str1 = "abc" 等效。

二。JVM記憶體區域

jdk1.8之前,代表jvm內一塊區域。jdk1.8之後,也就是元空間metaspace。存放類,靜態變數,常量池。總之與類有關的都在方法區。類一般先載入進方法區。寫好的 被翻譯成位元組碼,對應各種位元組碼指令。計數器就是記錄當前位元組碼指令的位置。jvm多執行緒併發操作時,每個執行緒都有自己的計數...

JVM的記憶體區域劃分

jvm的記憶體區域劃分 在j a語言當中,記憶體是如何劃分的呢?由於j a程式是交由jvm執行的,所以我們在談j a記憶體區域劃分的時候事實上是指jvm記憶體區域劃分。在討論jvm記憶體區域劃分之前,先來看一下j a程式具體執行的過程 如上圖所示,首先j a源 檔案 j a字尾 會被j a編譯器編譯...

jvm系列 一 jvm記憶體區域與溢位

string s2 new string jiajun string s6 new string jiajun system.out.println s2 s6 string s6 new string jiajun string s1 jiajun system.out.println s1 s6...