Java虛擬機器JVM總結(一)JVM運行原理及JVM中的Stack和Heap的實現過程

來源:互聯網
上載者:User

標籤:jvm   java   

Java語言寫的來源程式通過Java編譯器,編譯成與平台無關的‘位元組碼程式’(.class檔案,也就是0,1二進位程式),然後在OS之上的Java解譯器中解釋執行,而JVM是java的核心和基礎,在java編譯器和os平台之間的虛擬處理器。

一、JVM原理

1、JVM簡介:

JVM是java的核心和基礎,在java編譯器和os平台之間的虛擬處理器。它是一種利用軟體方法實現的抽象的電腦基於下層的作業系統和硬體平台,可以在上面執行java的位元組碼程式。

java編譯器只要面向JVM,產生JVM能理解的代碼或位元組碼檔案。Java源檔案經編譯成位元組碼程式,通過JVM將每一條指令翻譯成不同平台機器碼,通過特定平台運行。


2.Java語言啟動並執行過程

Java語言寫的來源程式通過Java編譯器,編譯成與平台無關的‘位元組碼程式’(.class檔案,也就是0,1二進位程式),然後在OS之上的Java解譯器中解釋執行。



簡單點的話也和下面的原理差不多


3、JVM執行程式的過程 :

I.載入。class檔案

II.管理並分配記憶體

III.執行垃圾收集

JRE(java運行時環境)由JVM構造的java程式的運行環境




二、JVM中的Stack和Heap

在JVM中,記憶體分為兩個部分,Stack(棧)和Heap(堆),這裡,我們從JVM的記憶體管理原理的角度來認識Stack和Heap,並通過這些原理認清Java中靜態方法和靜態屬性的問題。

1、簡介

Stack(棧)是JVM的記憶體指令區。Stack管理很簡單,push一定長度位元組的資料或者指令,Stack指標壓棧相應的位元組位移;pop一定位元組長度資料或者指令,Stack指標彈棧。Stack的速度很

快,管理很簡單,並且每次操作的資料或者指令位元組長度是已知的。所以Java 基礎資料型別 (Elementary Data Type),Java 指令代碼,常量都儲存在Stack中。

Heap(堆)是JVM的記憶體資料區。Heap 的管理很複雜,每次分配不定長的記憶體空間,專門用來儲存對象的執行個體。在Heap 中分配一定的記憶體來儲存對象執行個體,實際上也只是儲存對象執行個體的

屬性值,屬性的類型和對象本身的類型標記等,並不儲存對象的方法(方法是指令,儲存在Stack中),在Heap 中分配一定的記憶體儲存對象執行個體和對象的序列化比較類似。而對象執行個體在Heap 

中分配好以後,需要在Stack中儲存一個4位元組的Heap 記憶體位址,用來定位該對象執行個體在Heap 中的位置,便於找到該對象執行個體。


為JVM的體繫結構


2、什麼是資料、什麼是指令,對象的方法和對象的屬性又是什嗎?

1)方法本身是指令的作業碼部分,儲存在Stack中;

2)方法內部變數作為指令的運算元部分,跟在指令的作業碼之後,儲存在Stack中(實際上是簡單類型儲存在Stack中,物件類型在Stack中儲存地址,在Heap 中儲存值);上述的指令操作碼和指令運算元構成了完整的Java 指令。


3)對象執行個體包括其屬性值作為資料,儲存在資料區Heap 中。

非靜態對象屬性作為對象執行個體的一部分儲存在Heap 中,而對象執行個體必須通過Stack中儲存的地址指標才能訪問到。因此能否訪問到對象執行個體以及它的非靜態屬性值完全取決於能否獲得對象執行個體在Stack中的地址指標。


3、非靜態方法和靜態方法的區別:

非靜態方法有一個和靜態方法很重大的不同:非靜態方法有一個隱含的傳入參數,該參數是JVM給它的,和我們怎麼寫代碼無關,這個隱含的參數就是對象執行個體在Stack中的地址指標。因此非靜態方法(在Stack中的指令代碼)總是可以找到自己的專用資料(在Heap 中的對象屬性值)。當然非靜態方法也必須獲得該隱含參數,因此非靜態方法在調用前,必須先new一個對象實例,獲得Stack中的地址指標,否則JVM將無法將隱含參數傳給非靜態方法。


靜態方法無此隱含參數,因此也不需要new對象,只要class檔案被ClassLoader load進入JVM的Stack,該靜態方法即可被調用。當然此時靜態方法是存取不到Heap 中的對象屬性的。

小結::當一個class檔案被ClassLoader load進入JVM後,方法指令儲存在Stack中,此時Heap 區沒有資料。然後程式技術器開始執行指令,如果是靜態方法,直接依次執行指令代碼,當然此時指令代碼是不能訪問Heap 資料區的;如果是非靜態方法,由於隱含參數沒有值,會報錯。因此在非靜態方法執行前,要先new對象,在Heap 中分配資料,並把Stack中的地址指針交給非靜態方法,這樣程式技術器依次執行指令,而指令代碼此時能夠訪問到Heap 資料區了。


靜態屬性和動態屬性:

前面提到對象執行個體以及動態屬性都是儲存在Heap 中的,而Heap 必須通過Stack中的地址指標才能夠被指令(類的方法)訪問到。

因此可以推斷出:靜態屬性是儲存在Stack中的,而不同於動態屬性儲存在Heap 中。正因為都是在Stack中,而Stack中指令和資料都是定長的,因此很容易算出位移量,也因此不管什麼指令(類的方法),都可以訪問到類的靜態屬性。也正因為靜態屬性被儲存在Stack中,所以具有了全域屬性。


在JVM中,靜態屬性儲存在Stack指令記憶體區,動態屬性儲存在Heap資料記憶體區。


總結:

1)、棧是運行時的單位,而堆是儲存的單位。

2)、棧解決程式的運行問題,即程式如何執行,或者說如何處理資料;堆解決的是資料存放區的問題,即資料怎麼放、放在哪兒。


4、為什麼要把堆和棧區分出來呢?

第一,從軟體設計的角度看,棧代表了處理邏輯,而堆代表了資料。這樣分開,使得處理邏輯更為清晰。分而治之的思想。這種隔離、模組化的思想在軟體設計的方方面面都有體現。

第二,堆與棧的分離,使得堆中的內容可以被多個棧共用(也可以理解為多個線程訪問同一個對象)。這種共用的收益是很多的。一方面這種共用提供了一種有效資料互動方式(如:共用記憶體),另一方面,堆中的共用常量和緩衝可以被所有棧訪問,節省了空間。

第三,棧因為運行時的需要,比如儲存系統啟動並執行上下文,需要進行位址區段的劃分。由於棧只能向上增長,因此就會限制住棧儲存內容的能力。而堆不同,堆中的對象是可以根據需要動態增長的,因此棧和堆的拆分,使得動態增長成為可能,相應棧中只需記錄堆中的一個地址即可。

第四,物件導向就是堆和棧的完美結合。其實,物件導向方式的程式與以前結構化的程式在執行上沒有任何區別。但是,物件導向的引入,使得對待問題的思考方式發生了改變,而更接近於自然方式的思考。當我們把對象拆開,你會發現,對象的屬性其實就是資料,存放在堆中;而對象的行為(方法),就是運行邏輯,放在棧中。我們在編寫對象的時候,其實即編寫了資料結構,也編寫的處理資料的邏輯。


程式要運行總是有一個起點的。同C語言一樣,java中的Main就是那個起點。無論什麼java程式,找到main就找到了程式執行的入口:)


5、堆中存什嗎?棧中存什嗎?

1)、堆中存的是對象。棧中存的是基礎資料型別 (Elementary Data Type)和堆中對象的引用。一個對象的大小是不可估計的,或者說是可以動態變化的,但是在棧中,一個對象只對應了一個4btye的引用。

2)、為什麼不把基本類型放堆中呢?因為其佔用的空間一般是1~8個位元組——需要空間比較少,而且因為是基本類型,所以不會出現動態增長的情況——長度固定,因此棧中儲存就夠了,如果把他存在堆中是沒有什麼意義的(還會浪費空間,後面說明)。可以這麼說,基本類型和對象的引用都是存放在棧中,而且都是幾個位元組的一個數,因此在程式運行時,他們的處理方式是統一的。但是基本類型、對象引用和對象本身就有所區別了,因為一個是棧中的資料一個是堆中的資料。最常見的一個問題就是,Java中參數傳遞時的問題。

3)、Java中的參數傳遞時傳值呢?還是傳引用?程式運行永遠都是在棧中進行的,因而參數傳遞時,只存在傳遞基本類型和對象引用的問題。不會直接傳對象本身。

Java在方法調用傳遞參數時,因為沒有指標,所以它都是進行傳值調用


PS:堆和棧中,棧是程式運行最根本的東西。程式運行可以沒有堆,但是不能沒有棧。而堆是為棧進行資料存放區服務,說白了堆就是一塊共用的記憶體。不過,正是因為堆和棧的分離的思想,才使得Java的記憶體回收成為可能。


Java虛擬機器JVM總結(一)JVM運行原理及JVM中的Stack和Heap的實現過程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.