JVM之記憶體管理,jvm記憶體管理

來源:互聯網
上載者:User

JVM之記憶體管理,jvm記憶體管理

  都說搞C的牛叉,那是因為C解決問題,全靠程式員自己。而我們Java有異常機制,數組越界了會提示,開發效率也比C高,不需要程式員對底層瞭解太多,那是因為最困難的問題,已經被前人解決了。這一切都歸功於Java Virtual Machine-Java虛擬機器。JVM其實就是一個抽象的電腦,它有自己的指令集,有自己的機器語言(ByteCode,Class檔案),有自己的記憶體管理。本系列會一一解開它的真面目。

  本文基於Java HotSpot 虛擬機器,JDK 1.8,將討論:

  • JVM內部結構
  • JVM記憶體管理

 

圖 1 JVM內部結構

1. JVM 內部結構

  一個程式執行的過程是這樣的,以C語言為例,原始碼首先被編譯成可執行檔,以二進位的形式存放到磁碟上,當執行時,首先從磁碟載入到記憶體中,然後處理器就開始執行目標程式中機器指令。反觀Java,首先編譯成位元組碼檔案,與平台無關,JVM通過ClassLoader載入到記憶體中,然後執行其中的機器指令,JVM幫我們跟作業系統打交道。有了位元組碼和JVM,Java實現了平台無關性。由可知,JVM記憶體主要由以下幾個部分組成:

(1) Heap

  堆,一個非常重要的地區,被所有線程共用,基本所有的對象執行個體都在這裡分配,大部分的記憶體回收也發生在這裡,JVM使用Garbage Collector(自動記憶體管理工具)為對象分配記憶體,使用不同的記憶體回收策略釋放記憶體,對象不能夠被顯示的釋放。可以使用參數來控制Java 堆的容量是固定的,還是動態擴充的。

(2) JVM Stacks

  棧,與線程息息相關,線程私人,隨線程生而生,死而死,這部分記憶體就不需要JVM刻意的去管理了。主要用來儲存棧幀,當調用一個方法時建立一個棧幀,方法結束銷毀,從棧的角度來看,就是入棧和出棧兩個操作。

  棧幀是一個資料結構,用來儲存局部變數,運算元棧,和當前類運行時常量池的引用。局部變數數組:用來儲存方法內定義的基本類型變數,下標從 0 開始,JVM使用局部變數表傳遞方法參數,當調用一個執行個體方法,第 0 位置儲存的是當前對象的 this 引用;運算元棧:用來執行運算和準備調用方法的參數以及方法的返回結果;動態連結:引用對象的運行時常量池。

(3) PC Register

  程式計數器,線程私人,主要作用就是,取指,解碼和執行。如果執行的方法是 native 本地方法,此時計數器的值為 undefined。

(4) Metaspace

  元空間,在JDK8之前的HotSpot VM稱之為方法區或者永久代,被各線程共用,它儲存了一個類的結構資訊,如運行時常量池、欄位、方法等。存放在本地記憶體中,與堆不相關。

(5) Native Method Stacks

  JVM棧是為Java方法準備的,那麼本地方法棧則是為虛擬機器調用本地方法服務的。

2. JVM 記憶體管理

  首先看一下,HotSpot VM 內部堆的結構:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.