天天看點

JVM了解筆記JVM了解筆記

JVM了解筆記

Java虛拟機,讓Java實作跨平台的機制。專門編譯Java代碼

組成:

​ 類加載器(ClassLoader)

​ 運作時資料區(Runtime Data Area)

​ 執行引擎(Execution Engine)

​ 本地庫接口(Native Interface)

作用:

通過類加載器(ClassLoader)會把 Java 代碼轉換成位元組碼,運作時資料區(Runtime Data Area)再把位元組碼加載到記憶體中,而位元組碼檔案隻是 JVM 的一套指令集規範,并不能直接交個底層作業系統去執行,是以需要特定的指令解析器執行引擎(Execution Engine),将位元組碼翻譯成底層系統指令,再交由 CPU 去執行,而這個過程中需要調用其他語言的本地庫接口(Native Interface)來實作整個程式的功能。

jvm 運作時資料區

程式計數器

虛拟機棧

本地方法棧

方法區

有的區域随着虛拟機程序的啟動而存在,有的區域則依賴使用者程序的啟動和結束而建立和銷毀。

記憶體管理

(1)對于Java運作時涉及到的存儲區域主要包括程式計數器、Java虛拟機棧、本地方法棧、java堆、方法區以及直接記憶體等等。對于每個部分,都有其使用的條件。程式計數器主要是取下一條指令,在Java裡面主要是取下一條指令的位元組碼檔案;Java虛拟機棧主要是利用棧先進後出的特性存儲局部變量表,動态連結等,主要包括堆記憶體和棧記憶體,對于程式員記憶體分析而言是特别重要的。本地方法棧與上邊的棧基本作用差不多,隻不過這裡是為Java方法而服務。Java堆是記憶體管理中最大的一塊,所有的線程共享這一塊内容,同時該部分也是垃圾收集器的主要區域。

(2)虛拟機的垃圾回收機制是完善的,動态記憶體配置設定和回收是比較成熟的,在記憶體管理機制中,大部分都不需要我們考慮記憶體回收,隻有Java堆和方法區需要我們考慮處理記憶體問題。一般的對于記憶體回收首先就是判斷某一個部分是生存還是死亡,主要是通過下面二種算法:

其一是引用計數算法,本算法實作簡單,判定的效率也是比較高的,很多的軟體都使用了該算法,但是主流的Java并沒有選擇該算法,核心的問題是該算法難以處理對象之間互相調用的問題。

其二是稱可達性分析算法,該算法核心思想是依靠判斷對象是否存活來實作的,本算法是通過一系列的GC ROOTS的對象作為起始點,采用搜尋的算法周遊引用鍊,如果搜尋過程中沒有發現該節點,則認為該節點是不可達的,即可回收的,在Java裡面,一般可以使用該算法處理問題。

特性

1、移植性

無論是GC還是Hotspot都可以用在任何Java可用的地方。比方說,JRuby可以運作在其他平台上,Rails應用就可以運作在IBM主機上的JRuby上,而且這台IBM主機運作的是CP/CMS.實際上,由于Java和OpenJDK項目的開源,我們正在看到越來越多的平台的衍生,是以JVM的移植性也将越來越棒。

2、成熟

JVM已有多年的曆史,在過去的這些年裡,許多開發者為它做出了許多貢獻,使得它的性能一次又一次地提升,讓JVM變得更加穩定、快速和廣泛。

3、覆寫面

JRuby和JVM上的其他語言項目已經被承認,一個例子是invokedynamic specification(akaJSR292)。JSR越來越配合新的語言,JVM已不再是Java一個人定制規則。JVM正在建構成為類如JRuby等項目的優良平台。還有一個MLVM(multiple languageVM)項目,好比是新特性的清算機構,是一個許多企業應用的開發者試圖添加應用的地方,而這些應用正是他們想在JVM中看到的。而且JVM開發者互相協作、彼此影響,無疑這有利于JVM新特性的誕生。這些細節都可以看到JVM正在關注開發者的需求,擴大他的覆寫面。