溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么進行JVM原理入門

發(fā)布時間:2021-12-03 11:24:25 來源:億速云 閱讀:148 作者:柒染 欄目:云計算

本篇文章為大家展示了怎么進行JVM原理入門,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

怎么進行JVM原理入門

類裝載器ClassLoader

負責加載class文件,class文件在文件開頭有特定的文件標識,將class文件字節(jié)碼內容加載到內存中,并將這些內容轉換成方法區(qū)中的運行時數據結構并且ClassLoader只負責class文件的加載,至于它是否運行,則是由Execution Engine決定 (快遞員)

1、虛擬機自帶的加載器:

啟動類加載器(Bootstrap)C++ :加載jdk原始自帶的類,在jdk1.8.0_201\jre\lib\rt.jar下,如Object、String、ArrayList等 但是如果要用getClassLoader獲取加載器名的話會顯示null,因為該加載器是C++寫的不是Java的

擴展類加載器(Extension)Java:加載jdk升級過程中擴展的類,在jdk1.8.0_201\jre\lib\ext目錄下

應用程序類加載器(AppClassLoader)java也叫系統(tǒng)類加載器,加載當前 應用的classpath的所有類

怎么進行JVM原理入門

怎么進行JVM原理入門

2、用戶自定義加載器 

Java.lang.ClassLoader的子類,用戶可以定制的加載方式

3、常見面試問題

雙親委派機制:

(1)如果一個類加載器收到了類加載請求,不自己加載而是把請求給其父類去執(zhí)行.

(2)若父類加載器還存在其父類的加載器,進一步向上委托.

(3)如果父類加載器可以完成類加載任務就返回,若不能才讓自己子類加載

沙箱安全:雙親委派機制保證了Java的出廠源碼不會受到開發(fā)人員編寫的污染(沙箱安全機制)

本地方法接口

一個Native Method就是一個Java調用非Java代碼的接口,該方法是由非Java語言實現。

有時Java應用需要與Java外面的環(huán)境交互,這是本地方法存在的主要原因。你可以想想Java需要與一些底層系統(tǒng),如操作系統(tǒng)或某些硬件交換信息時的情況。本地方法正是這樣一種交流機制:它為我們提供了一個非常簡潔的接口,而且我們無需去了解Java應用之外的繁瑣的細節(jié)。

PC寄存器(程序計數器)

每一個線程都有一個程序計數器,是線程私有的,就是一個指針,用來存儲指向下一條指令的地址,也就是將要執(zhí)行的指令代碼。是一塊兒非常小的內存,它是當前線程所要執(zhí)行的字節(jié)碼的行號指示器。如果執(zhí)行的是一個Native方法,那么這個計數器是空的。

方法區(qū)

它存儲了每個類的結構信息,例如運行時常量池、字段和方法數據、構造函數和普通方法的字節(jié)碼內容。

上面說的是規(guī)范,在不同的虛擬機里實現是不一樣的。最經典的就是永久代和元空間。

實例變量存在堆內存中,與方法區(qū)無關

stack(java棧)

棧又叫棧內存,主管java程序的運行,是在線程創(chuàng)建時創(chuàng)建,他的生命周期是跟隨線程的生命周期,線程結束棧內存也就釋放,對于棧來說不存在垃圾回收問題,生命周期和線程一致,是線程私有的。8種基本類型的變量+對象的引用變量+實例方法都是在函數的棧內存中分配的。

5.1棧幀(在外面就是方法)中主要保存3類數據:

本地變量:輸入參數和輸出參數以及方法內的變量;

棧操作:記錄出棧、入棧的操作;

棧幀數據:包括類文件、方法等等。

怎么進行JVM原理入門

5.2java.lang.StackOverflowError (棧溢出)他是一個錯誤,是一個error

5.3 棧+堆+方法區(qū)的交互關系

HotSpot(一般咱們的jdk都是這個版本)是使用指針的方式來訪問對象。

Java堆中會存放訪問類元數據的地址

reference存儲的就直接是對象的地址

怎么進行JVM原理入門

heap堆

一個JVM實例只存在一個堆內存,堆內存的大小是可以調節(jié)的。

先看下JAVA堆內存是如何劃分的,如圖:

怎么進行JVM原理入門

(1)JVM內存簡單可以劃分為堆內存和非堆內存,堆內存分為年輕代(Young Generation)、老年代(Old Generation),非堆內存有永久代(Permanent Generation),jdk1.8及之后元空間取代永久代。

(2)年輕代又分為Eden和Survivor區(qū)。Survivor區(qū)由FromSpace和ToSpace組成。Eden區(qū)占大容量,Survivor兩個區(qū)占小容量,默認比例是8:1:1。

(3)堆內存用途:存放的是對象,垃圾收集器就是收集這些對象,然后根據GC算法回收。

(4)非堆內存用途:永久代,一般hotspot下也稱為方法區(qū),存儲程序運行時長期存活的對象,比如類的元數據、方法、常量、屬性等。

重點:

(1)首先當Eden區(qū)滿的時候會觸發(fā)第一次GC,把活著的對象拷貝到SurvivorFrom區(qū)

        然后當Eden區(qū)再次觸發(fā)GC的時候會掃描Eden+From區(qū),對這兩個區(qū)域進行垃圾回收,經過這次回收后還存活的對象,則直接復制到To區(qū)(如果有對象的年齡已經達到了老年的標準,則賦值到老年代區(qū)),同時把這些對象的年齡+1

(2)清空Eden、SurvivorFrom

然后,清空Eden和SurvivorFrom中的對象,也即復制之后有交換,誰空誰是to

Old(養(yǎng)老區(qū))滿了,開啟

Full GC = FGC (重GC)

如果Full GC多次,發(fā)現老年代也滿了,就會報 OOM(堆內存溢出)

怎么進行JVM原理入門

元空間與永久代

Jdk1.8以后開始把類的元數據放在元空間(Metaspace)中,該區(qū)域在jdk7及以前是屬于永久帶的,元空間和永久代都是用來存儲class相關信息,包括class對象的Method,Field等,元空間和永久代其實都是方法區(qū)的實現,只是實現有所不同,所以說方法區(qū)其實只是一種JVM的規(guī)范。

兩者最大的區(qū)別是元空間使用本地內存,而永久代使用的是JVM的內存,也就是說,本地內存剩余多少理論上metaspace就可以有多大,這解決了空間不足的問題,不過也不可能任其無限壯大,JVM默認在運行時會根據需要動態(tài)的設置其大小。

GC是什么(分代收集算法)

1、次數上頻繁收集Young區(qū)

2、次數上較少收集Old區(qū)

3、基本不動Perm區(qū)

JVM在進行GC時,大部分時候回收的都是新生代。

因此GC按照回收的區(qū)域分了兩種類型,一種是普通的GC(minor GC),一種是全局GC(minor GC or Full GC)

針對HotSpot VM的實現,它里面的GC其實準確分類只有兩大種:

1.Partial GC:并不收集整個GC堆的模式,具體如下:

Young GC/Minor GC:只收集新生代的GC。

Old GC:只收集老年代的GC。只有CMS的concurrent collection是這個模式。

Mixed GC:收集整個新生代以及部分老年代的GC,只有G1有這個模式。

2.Full GC/Major GC:收集整個GC堆的模式,包括新生代、老年代、永久代(如果存在的話)等所有部分的模式。

常見垃圾收集算法

標記 - 清除算法

首先標記出所有需要回收的對象,在標記完成后統(tǒng)一回收所有被標記的對象。它的主要不足有兩個:一個是效率問題,標記和清除兩個過程的效率都不高;另一個是空間問題,標記清除之后會產生大量不連續(xù)的內存碎片,空間碎片太多可能會導致以后在程序運行過程中需要分配較大對象時,無法找到足夠的連續(xù)內存而不得不提前觸發(fā)另一次垃圾收集動作。

復制算法

為了解決效率問題,一種稱為“復制”(Copying)的收集算法出現了,它將可用內存按容量劃分為大小相等的兩塊,每次只使用其中的一塊。當這一塊的內存用完了,就將還存活著的對象復制到另外一塊上面,然后再把已使用過的內存空間一次清理掉。這樣使得每次都是對整個半區(qū)進行內存回收,內存分配時也就不用考慮內存碎片等復雜情況,只要移動堆頂指針,按順序分配內存即可,實現簡單,運行高效。只是這種算法的代價是將內存縮小為了原來的一半,未免太高了一點。

標記 - 整理算法

復制收集算法在對象存活率較高時就要進行較多的復制操作,效率將會變低。更關鍵的是,如果不想浪費50%的空間,就需要有額外的空間進行分配擔保,以應對被使用的內存中所有對象都100%存活的極端情況,所以在老年代一般不能直接選用這種算法。

根據老年代的特點,有人提出了另外一種“標記-整理”(Mark-Compact)算法,標記過程仍然與“標記-清除”算法一樣,但后續(xù)步驟不是直接對可回收對象進行清理,而是讓所有存活的對象都向一端移動,然后直接清理掉端邊界以外的內存。

上述內容就是怎么進行JVM原理入門,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

jvm
AI