1. 程式人生 > >棧,堆,方法區及記憶體方面知識

棧,堆,方法區及記憶體方面知識

這裡主要分享幾個連結:

棧,堆,方法區http://www.cnblogs.com/kkcheng/archive/2011/02/25/1964521.html

記憶體管理http://www.cnblogs.com/gw811/archive/2012/10/18/2730117.html

垃圾收集器http://www.cnblogs.com/gw811/archive/2012/10/19/2730258.html

下面是自己目前不能忘記的皮毛

堆區: 
1.儲存的全部是物件,每個物件都包含一個與之對應的class的資訊。(class的目的是得到操作指令) 
2.jvm只有一個堆區(heap)被所有執行緒共享,堆中不存放基本型別和物件引用,只存放物件本身 


棧區: 
1.每個執行緒包含一個棧區,棧中只儲存基礎資料型別的物件和自定義物件的引用(不是物件),物件都存放在堆區中 
2.每個棧中的資料(原始型別和物件引用)都是私有的,其他棧不能訪問。 
3.棧分為3個部分:基本型別變數區、執行環境上下文、操作指令區(存放操作指令)。 
方法區: 
1.又叫靜態區,跟堆一樣,被所有的執行緒共享。方法區包含所有的class和static變數。 
2.方法區中包含的都是在整個程式中永遠唯一的元素,如class,static變數。

還有對於字串的理解,String型別並不是JAVA的基本資料型別(JAVA八種基礎資料型別,參看http://www.cnblogs.com/simplefrog/archive/2012/07/15/2592011.html),所以new String()的物件其實是存放在堆區的。先放著我們接著看。

String s1="This is String";

String s2="This is String";

System.out.println(s1==s2);輸出true。

String s3=new String("This is String");

System.out.println(s1==s3);輸出false。

為什麼呢?s1==s2這一類比較的是引用的物件(在JAVA裡面s1.equals(s2)比較的是引用的內容都為true)。

String s1="This is String"得到的是來自堆中的字串的引用,當String s2="This is String"執行時發現棧裡面已經存在了該字串的引用(String類是常量類,參看http://blog.csdn.net/qq_38584967/article/details/78385655),那麼就會把棧中這個字串的引用賦予s2,這樣一來s1和s2就變成了對同一個物件的引用了,於是s1==s2返回true。

再看s3,上面說了String不是基本資料型別,所以String s3=new String("This is String")是直接得到的是一個在堆中新建的物件的引用,雖然它的內容和s1引用的內容是一樣的,但記憶體並不是同一塊,於是比較棧中兩個引用s1==s3返回的是false,因為引用的物件不同。

哈哈,自己的以為,所以可能有些偏差,若是有人看到這篇部落格了,有不對或疑問的請及時留言指正。互相學習,謝謝!