堆棧、堆、方法區介紹

堆棧、堆、方法區介紹

終於開始看java啦…不知道有沒有很多人跟我一樣想法,先把安卓看完了再去看java,因爲安卓直接跟工資掛鉤而java更多的是內功.直到前段時間我和我們這邊後臺大佬對接開發websocket噩夢就開始了,這個線程不安全,這個單例在某些情況下有問題,這裏應該這樣封裝等等…..每天圍繞在我腦邊,本來就是第一次做websocket,在加上後臺大佬java大法猛如虎,真是感覺自己啥也不會了.

…不過現在是熬過來啦而且以後我可以說我做過基於websocket協議的im啦啦啦啦,容我嘚瑟一波哈哈哈哈( 這裏需要感謝後臺大佬剛哥帶我把im搞了一遍:) )

這裏也是預告我後面會寫websocket的blog總結的,還往大家捧場.扯遠了,回到主題正是因爲這次經歷讓我意識到java的重要,重要的事再說一遍我要開始學java了.後面會陸續更新這個系列.覺得寫得好的不好的都給點個贊蛤,感謝!

預備知識

  • java數據類型:

    1. 基礎數據類型:boolean、byte、short、char、int、long、float、double

    2. 引用數據類型:類、接口、數組

堆棧、堆、方法區

JAVA的JVM的內存可分爲3個區:堆(heap)、堆棧(stack)和方法區(method)

  • 堆區:

    1. 提供所有類實例和數組對象存儲區域

    2. jvm只有一個堆區(heap)被所有線程共享,堆中不存放基本類型和對象引用,只存放對象本身

  • 棧區:

    1. 每個線程包含一個棧區,棧中只保存基礎數據類型的對象和自定義對象的引用(不是對象),對象都存放在堆區中

    2. 每個棧中的數據(原始類型和對象引用)都是私有的,其他棧不能訪問。

  • 方法區:

    1. 又叫靜態區,跟堆一樣,被所有的線程共享。方法區包含所有的class和static變量。

    2. 方法區中包含的都是在整個程序中永遠唯一的元素,如class,static變量。

    3. 運行時常量池都分配在 Java 虛擬機的方法區之中

栗子


public void test(){
  A a = new A();
  int b = 1;
}

public class A{

}

這個栗子中

  • a是A對象的引用所以放在棧中,A是自定義對象所以放在堆中.

  • b是基礎數據類型所以在棧中.

小結

這裏用一個在別處看到的栗子總結再好不過

堆和棧的區別可以用如下的比喻來看出:

  • 使用棧就象我們去飯館裏吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就
    走,不必理會切菜、洗菜等準備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自
    由度小。

  • 使用堆就象是自己動手做喜歡吃的菜餚,比較麻煩,但是比較符合自己的口味,而且自由
    度大。

第一次blog寫這麼短有點方.如果有錯誤的地方還望大佬們指出…小弟感激涕零

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章