對Java內存模型的一些理解

線程私有:程序計數器、虛擬機棧、本地方法棧

  1. 程序計數器:記錄了程序執行的字節碼的行號和指令,方便線程切換。
  2. 虛擬機棧 :局部變量表(原生類型、引用類型),方法調用棧 --平時說的棧。可拋出StackOverflowError異常和OutOfMemoryError
  3. 本地方法棧則是爲虛擬機執行Native方法服務的。

線程共享:堆、方法區等。

  1. 堆(java Heap):新生代和老年代;再細緻一些可以分爲:Eden空間、From Survivor、To Survivor等。

  2. 方法區(Method Area):
    與java堆一樣,是各個線程共享一塊內存區域,用於存儲虛擬機加在的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據。雖然java虛擬機把他標註爲堆的一部分,但他也有一個別名“非堆”,用於與java堆區分。
    對於HotSport虛擬機上開發、部署的程序員來說,很多人都更願意把方法區成爲"永久代"(Permanent Generation),進入永久代不代表不被垃圾回收了

  3. 運行時常量池(RuntimelyConstant Pool):
    String類的intern()方法利用的比較多。

  4. 直接內存(DirectMemory)
    不是虛擬機運行時數據區的一部分,也不是java迅疾規範中定義的內存區域。但這部分內存也被頻繁的使用,而且也可能導致OutOffMemoryError異常。

Java虛擬機之虛擬機棧與本地方法棧

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