隨筆-10  評論-11  文章-20  trackbacks-0
                  java程序運行的關鍵是棧和堆。它們是把內存形象的分為棧內存和堆內存,棧是運行時的單位,堆時存儲單位。棧內存中存儲著句柄,堆內存中存儲著具體內容。而且在實例化的時候建立句柄對內容的指向關系,程序運行,首先訪問句柄,然后調用具體內容。

          例:在new完一個具name和age兩個屬性的P后棧和堆得關系如下圖所示:

                   那么為什么要有這種設計原理呢?從軟件設計的角度看,棧代表了處理邏輯,而堆代表了數據。這樣分開,使得處理邏輯更為清晰,分而治之的思想。這種隔離、模塊化的思想在軟件設計的方方面面都有體現。        堆與棧分離,使得堆中的內容可以被多個棧共享(也可以理解為多個線程訪問同一個對象)這種共享的收益是很多的,一方面這種共享提供了一種有效的數據交互(共享內存),另一方面,堆中的共享常量和緩存可以被所有棧訪問,節省了空間。        棧因為運行時的需要,比如保存系統運行的上下文,需要進行地址段的劃分。由于棧只能向上增長,因此就會限制住棧存儲內容的能力。而堆不同,堆中的對象是可以根據需要動態增長的,因此棧和堆的拆分,使得動態增長成為可能,相應棧中只需記錄堆中的一個地址即可。        Java 的堆是一個運行時數據區,類的對象從中分配空間。這些對象通過new、newarray、anewarray和multianewarray等指令建立,它們不需要程序代碼來顯式的釋放。        堆是由垃圾回收來負責的,堆的優勢是可以動態地分配內存大小,生存期也不必事先告訴編譯器,因為它是在運行時動態分配內存的,Java的垃圾收集器會自動收走這些不再使用的數據。但缺點是,由于要在運行時動態分配內存,存取速度較慢。        棧的優勢是,存取速度比堆要快,僅次于寄存器,棧數據可以共享。但缺點是,存在棧中的數據大小與生存期必須是確定的,缺乏靈活性。棧中主要存放一些基本類型的變量(int, short, long, byte, float, double, boolean, char)和對象句柄。

          例:在new完兩個具name和age兩個屬性的P1和P2后,內存會發生如下變化:

          當執行P2 = P1時,指向將會發生變化:

          當先執行P1.name = "price";P1.age=43后堆內存改變,但是執行完P2.name = "soap";P2.age = 23后堆內存則發生如下改變,原先P2所指的那塊堆內存則成為垃圾,又GC進行回收:

          posted on 2010-10-12 22:33 Soap MacTavish 閱讀(1793) 評論(1)  編輯  收藏

          評論:
          # re: 對Java中棧(stack)和堆(heap)的一點小認識 2015-12-27 20:22 | wuwuwuwu
          句柄  回復  更多評論
            

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 老河口市| 宽城| 高邮市| 祁东县| 昆山市| 扶风县| 宁城县| 晋宁县| 顺昌县| 茶陵县| 大化| 平度市| 邻水| 铜梁县| 彭山县| 谢通门县| 黄陵县| 玉树县| 江孜县| 曲麻莱县| 大厂| 昌宁县| 宁海县| 朔州市| 沙河市| 纳雍县| 福鼎市| 策勒县| 大冶市| 托克逊县| 陇西县| 祁门县| 新乐市| 孝昌县| 托里县| 玉屏| 建湖县| 高州市| 阿图什市| 济阳县| 灵宝市|