堆總被分為兩個部分:新生代和老年代,其中新生代中又被分為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...