JVM記憶體結構--概述

語言: CN / TW / HK

一、Java虛擬機器

Java 虛擬機器是一臺執行Java位元組碼的虛擬計算機,它擁有獨立的執行機制,其執行的Java位元組碼也未必由Java語言編譯而成。

JVM平臺的各種語言可以共享Java 虛擬機器帶來的跨平臺性、優秀的垃圾回器,以及可靠的即時編譯器。

Java技術的核心就是Java虛擬機器(JVM,Java Virtual Machine),因為所有的Java程式都執行在Java虛擬機器內部。

Java 虛擬機器就是二進位制位元組碼的執行環境,負責裝載位元組碼到其內部,解釋/編譯為對應平臺上的機器指令執行。

每一條Java指令,Java虛擬機器規範中都有詳細定義,如怎麼取運算元,怎麼處理運算元,處理結果放在哪裡。

優點: - 一次編譯,到處執行 - 自動記憶體管理 - 自動垃圾回收功能

二、JVM的位置

計算機硬體上的第一層軟體就是作業系統了,而jvm是基於作業系統之上的,他並沒有與硬體有直接的互動。 其次,使用者可通過Java編譯器編譯生成位元組碼檔案,讓位元組碼檔案在jvm上執行。

image.png

三、JVM整體結構

image.png

Java虛擬機器在執行Java程式 時,把它所管理的記憶體劃分為若干個不同的資料區域,主要包括以下五個部分:方法區(Method Area),Java 堆(heap)、虛擬機器棧(JVM Stacks)、本地方法棧(Native Method Stack),程式計數器(Program Counter Register)

四、JVM的架構模型

Java編譯器輸入的指令流基本上是一種基於棧的指令集架構,另外一種指令集架構則是基於暫存器的指令集架構。具體來說:這兩種架構之間的區別:

  1. 基於棧式架構的特點

  2. 設計和實現更簡單,適用於資源受限的系統

  3. 避開了暫存器的分配難題:使用零地址指令方式分配。
  4. 指令流中的指令大部分是零地址指令,其執行過程依賴於操作棧。指令集更小,編譯器容易實現。
  5. 不需要硬體支援,可移植性更好,更好實現跨平臺基於暫存器架構的特點

  6. 基於暫存器架構的特點

  7. 典型的應用是x86的二進位制指令集:比如傳統的PC以及Android 的 Davlik虛擬機器。

  8. 指令集架構則完全依賴硬體,可移植性差。
  9. 效能優秀和執行更高效
  10. 花費更少的指令去完成一項操作。
  11. 在大部分情況下,基於暫存器架構的指令集往往都以一地址指令、二地址指令和三地址指令為主,而基於棧式架構的指令集卻是以零地址指令為主。

五、JVM基於棧架構的優缺點

由於java跨平臺的設計,java的指令都是根據棧來設計的,不同平臺CPU架構不同,所以不能設計為基於暫存器的。

  • 棧:跨平臺性、指令集小(所有指令的集合)、指令多(基於記憶體的棧架構,需要多條指令完成一個操作);執行性比暫存器差
  • 暫存器:指令少,執行快,但是設計複雜。

六、JVM生命週期

  1. 啟動

通過啟動類載入器(bootstrap ClassLoader)建立一個初始類(initial class)來完成的,這個類是由虛擬機器的具體實現指定的.

  1. 執行

一個執行中的java虛擬機器有著一個清晰的任務:執行Java程式

程式開始執行的時候他才執行,程式結束時他就停止

執行一個所謂的Java程式的時候,真真正正在執行的是一個叫做Java虛擬機器的程序

  1. 退出

程式正常執行結束

程式異常或錯誤而異常終止

作業系統錯誤導致終止

某執行緒呼叫Runtime類或System類的exit方法,或Runtime類的halt方法,並且java安全管理器也允許這次exit或halt操作

除此之外,JNI規範描述了用JNI Invocation API來載入或解除安裝Java虛擬機器時,Java虛擬機器的退出情況。

參考部落格:

本章內容主要來自於深入理解JVM(一)一一簡介和體系結構

# 尚矽谷宋紅康JVM全套教程(詳解java虛擬機器)

--個人學習筆記