這一期的主要學習內容是JVM

這一期的主要學習內容是JVM。學習Java的程序員如果不瞭解JVM,那麼永遠也算不上一流的程序員。

Java跨平臺的、面向對象的一門編程語言,那麼這裏有一個很重要的一點是Java的跨平臺,所謂的平臺是指操作系統,如Windows、Linux、Unix……,不同的操作系統,底層的機制是不一樣的,那麼同樣的Java代碼,如何能在不同的操作系統上獲取相同的結果呢,JVM就是實現這樣一個功能的“軟件”,Java Virtual Machine——Java虛擬機。

1)底層數據類型

JVM底層的數據類型包含兩大部分,基本數據類型和對象類型,基本數據類型包含整數類型、浮點類型、字符類型、布爾類型。

對象類型包含的是一個無限集合,所有非基本類型的都是對象類型,Java數組被當做object處理。虛擬機的規範對於object內部的結構沒有任何特殊的要求。在Sun公司的實現中,對object的引用是一個句柄,其中包含一對指針:一個指針指向該object的方法表,另一個指向該object的數據。用Java虛擬機的字節碼表示的程序應該遵守類型規定。Java虛擬機的實現應拒絕執行違反了類型規定的字節碼程序。Java虛擬機由於字節碼定義的限制似乎只能運行於32位地址空間的機器上。但是可以創建一個Java虛擬機,它自動地把字節碼轉換成64的形式。從Java虛擬機支持的數據類型可以看出,Java對數據類型的內部格式進行了嚴格規定,這樣使得各種Java虛擬機的實現對數據的解釋是相同的,從而保證了Java的與平臺無關性和可移植性。

(2)JVM運行原理

JVM是Java程序運行的容器,但是他同時也是操作系統的一個進程,因此他也有他自己的運行的生命週期,也有自己的代碼和數據空間。

JVM在整個jdk中處於最底層,負責與操作系統的交互,用來屏蔽操作系統環境,提供一個完整的Java運行環境,因此也就虛擬計算機.操作系統裝入JVM是通過jdk中Java.exe來完成,通過下面4步來完成JVM環境。

1.創建JVM裝載環境和配置

2.裝載JVM.dll

3.初始化JVM.dll並掛接到JNIENV(JNI調用接口)實例

4.調用JNIEnv實例裝載並處理class

 

JVM運行原理圖

(3)JVM內存結構

jvm區域總體分兩類,heap區和非heap區。

heap區又分:Eden Space(伊甸園)、Survivor Space(倖存者區)、Tenured Gen(老年代-養老區)。

非heap區又分:Code Cache(代碼緩存區)、Perm Gen(永久代)、Jvm Stack(java虛擬機棧)、Local Method Statck(本地方法棧)。

非heap區不做詳細的解釋,主要是介紹下heap去,也就是JVM的對象存儲區。

用戶創建的對象,首先會進入EdenSpace(伊甸園)區,GC輪詢之後,一直存活的、使用頻率很高的對象會被放入Survivor Space(倖存者區)。Survivor Space(倖存者區)的對象,經過GC的輪詢,相關的對象會進入Tenured Gen(老年代-養老區)。

 

JVM Heap分配原理圖

(4)垃圾回收(GC)

JVM在程序運行過程當中,會創建大量的對象,這些對象,大部分是短週期的對象,小部分是長週期的對象,對於短週期的對象,需要頻繁地進行垃圾回收以保證無用對象儘早被釋放掉,對於長週期對象,則不需要頻率垃圾回收以確保無謂地垃圾掃描檢測。爲解決這種矛盾,Sun JVM的內存管理採用分代的策略。

1)年輕代(Young Gen):年輕代主要存放新創建的對象,內存大小相對會比較小,垃圾回收會比較頻繁。年輕代分成1個Eden Space和2個Suvivor Space(命名爲A和B)。當對象在堆創建時,將進入年輕代的Eden Space。垃圾回收器進行垃圾回收時,掃描Eden Space和A Suvivor Space,如果對象仍然存活,則複製到B Suvivor Space,如果B Suvivor Space已經滿,則複製到Old Gen。同時,在掃描Suvivor Space時,如果對象已經經過了幾次的掃描仍然存活,JVM認爲其爲一個持久化對象,則將其移到Old Gen。掃描完畢後,JVM將Eden Space和A Suvivor Space清空,然後交換A和B的角色(即下次垃圾回收時會掃描Eden Space和BSuvivor Space。這麼做主要是爲了減少內存碎片的產生。

我們可以看到:Young Gen垃圾回收時,採用將存活對象複製到到空的Suvivor Space的方式來確保儘量不存在內存碎片,採用空間換時間的方式來加速內存中不再被持有的對象儘快能夠得到回收。
2)年老代(Tenured Gen):年老代主要存放JVM認爲生命週期比較長的對象(經過幾次的Young Gen的垃圾回收後仍然存在),內存大小相對會比較大,垃圾回收也相對沒有那麼頻繁(譬如可能幾個小時一次)。年老代主要採用壓縮的方式來避免內存碎片(將存活對象移動到內存片的一邊,也就是內存整理)。當然,有些垃圾回收器(譬如CMS垃圾回收器)出於效率的原因,可能會不進行壓縮。

 

JVM系統屬性:

查看系統屬性還可以通過jvisualvm命令

前提:安裝jdk,配置環境變量

查看方法:運行-->cmd-->jvisualvm-->打開Java VisualVM-->本地-->VisualVM-->概述-->系統屬性

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