自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一文了解Java虛擬機的重要組成

云計算 虛擬化
JVM是JAVA平臺的重要組成之一,因涉及知識點太多,故從以下幾個方面對JVM進行淺層面的介紹。

JVM是JAVA平臺的重要組成之一,因涉及知識點太多,故從以下幾個方面對JVM進行淺層面的介紹,如果需要深入理解,推薦學習機械工業(yè)出版社的《深入理解JAVA虛擬機》。

[[243270]]

一、JAVA內(nèi)存結(jié)構(gòu)

Java虛擬機規(guī)范中規(guī)定的JVM運行時數(shù)據(jù)區(qū)如下圖所示:

一文了解JAVA虛擬機的重要組成

 

總體來說,分為線程共享部分(方法區(qū)、堆)和線程隔離區(qū)(虛擬機棧、本地方法棧和程序計數(shù)器)。

1.方法區(qū)

用于存儲已被虛擬機加載的類信息、常量、靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據(jù)。其中常量存儲于運行時常量區(qū)中,運行時常量區(qū)是區(qū)的一部分,用于存儲編譯期生成的字面量和符號引用。但運行時常量區(qū)的內(nèi)容并不只是在編譯期間產(chǎn)生,通過String.intern()也可以實現(xiàn)在運行時向常量區(qū)中添加內(nèi)容。

2.堆

是JVM中***的一塊內(nèi)存區(qū)域,該區(qū)域的目的只是用于存儲對象實例及數(shù)組。該區(qū)域也是GC的最主要區(qū)域。

3.虛擬機棧

每個線程方法在執(zhí)行時都會創(chuàng)建一個棧幀,包含局部變量表、返回地址、操作數(shù)棧等信息。每個方法的執(zhí)行與完成就對應(yīng)的棧幀的入棧與出棧過程 。局部變量表占用空間的大小在編譯期就確定了。

4.本地方法棧

與虛擬機棧類似,不過其中執(zhí)行是本地方法。對于HotSpot虛擬機而言,本地方法棧和虛擬機棧是統(tǒng)一的。

5.程序計數(shù)器

是一個小的內(nèi)存空間,如果線程正在執(zhí)行的是一個java方法,則此內(nèi)存區(qū)域記錄正在執(zhí)行的虛擬機字節(jié)碼指令;如果線程正在執(zhí)行的是native方法,則計算器中的值為空。

二、JAVA垃圾回收機制

JAVA的垃圾回收主要涉及到確定對象是否存活、垃圾收集等算法,其中確定對象回收算法采用的是可達性分析算法,垃圾收集目前各JVM廠商廣泛采用的是分代收集算法。這里面主要描述下分代收集算法的過程。

一文了解JAVA虛擬機的重要組成

 

分代收集算法的核心思想是將內(nèi)存區(qū)域按照對象的生存周期階段進行劃分,其中將堆區(qū)劃分為新生代(young generation)和老年代(old generation)。將非堆區(qū)(一般指方法區(qū))劃分為持久代(permanent generation)。

1.新生代

新生代又可再分為Eden區(qū)和兩個Survivor區(qū)(兩個Survivor區(qū)的大小是一樣的,便于交換)。新生成的對象都會先在新生代的Eden區(qū)進行保存。新生代的特點是每次垃圾回收都會有大量的內(nèi)存被回收,而且收集比較頻繁,所以新生代適合如下的收集算法:

首先,新生成的對象分配到Eden區(qū),如果eden區(qū)滿了,則將可達性的對象復制到survivor1區(qū),后清空eden區(qū)。

然后,如果survivor1區(qū)滿了,則將eden區(qū)與survivor1區(qū)的可達性對象復制到survivor2區(qū),后清空eden區(qū)和survivor1區(qū),清空完后將survivor2區(qū)與survivor1區(qū)交換,即保持survivor2是空的。

再次,如果survivor2區(qū)也滿了,則將eden區(qū)、survivor1區(qū)、survivor2區(qū)的可達性對象復制到老年代中,并清空新生代中。

***,如果老年代也滿了,就觸發(fā)full gc了。

2.老年代

老年代的內(nèi)存比新生代大的多,這個區(qū)域執(zhí)行垃圾回收的頻度不高。當老年代滿時,會觸發(fā)full gc。

3.持久代

持久代一般指方法區(qū),該區(qū)需要回收的有廢棄的常量和類。對于常量可用可達性分析的方法進行判斷回收,對于類則需要同時滿足以下條件才會被回收:

首先,該類的所有實例對象都已被回收;

其次,該類的類加載器也已被回收;

再次,該類的Class方法沒有在任何地方被引用,即無法通過在任何地方通過反射訪問到該類的方法。

4.什么時候會解決垃圾回收?

綜上所述,當eden滿時,就會觸發(fā)scavenge gc,當出現(xiàn)以下情況時會觸發(fā)full gc:

老年代已滿;

持久代已滿;

調(diào)用System.gc()方法;

三、JAVA類加載過程

JVM類加載過程具體裝載、驗證、準備、解析、初始化這五個部分。

1.裝載

在裝載過程中,需要完成以下事情:

1)通過類的全限定名獲取類的二進制字節(jié)流;

2)將類的二進制字節(jié)流轉(zhuǎn)換為方法區(qū)的運行時數(shù)據(jù)結(jié)構(gòu);

3)生成一個代表此類的java.lang.Class對象,作為方法區(qū)這個類的各種數(shù)據(jù)的訪問入口。

2.驗證

驗證、解析和初始化又稱為是連接階段,在驗證驗證主要是確保二進制字節(jié)流符合JVM的規(guī)范,不會危害計算機的安全。具體驗證階段需要做的事情如下:

1)文件格式驗證,驗證字節(jié)流是否符合Class文件格式規(guī)范;

2)元數(shù)據(jù)驗證,對字節(jié)碼進行語義驗證,以保證其描述信息符合JAVA語言規(guī)范;

3)字節(jié)碼驗證,通過數(shù)據(jù)流和控制流分析,確定程序語義是合法的、符合邏輯的;

4)符號引用驗證,對常量池中的各種符號引用的信息進行匹配性驗證。

3.準備

準備的過程其實是分配內(nèi)存的過程。在這個階段有兩個容易產(chǎn)生混淆的概念:一是此階段分配內(nèi)存的只是類變量(static變量),不包含實例變量,實例變量的內(nèi)存分配是在對象實例化時隨對象一起分配在堆中;二是該階段分配內(nèi)存中保存的值只是數(shù)據(jù)類型的零值,具體值需要在初始化階段進行賦值。也有特殊情況,就是對于靜態(tài)常量(final修飾)會在準備階段將值賦值為真實值。

4.解析

解析階段就是將常量池內(nèi)折符號引用轉(zhuǎn)換為直接引用的過程,具體包括類和接口的解析、字段的解析、方法的解析、接口方法和解析。

5.初始化

初始化階段其實就是執(zhí)行類構(gòu)造函數(shù)(clinit)的階段。對于clinit()需要說明以下幾點:

1)clinit()中的程序是自動收集類中static變量及static塊產(chǎn)生的,執(zhí)行順序與代碼中的順序一致。靜態(tài)語句塊中只能訪問在其之前聲明的static變量,在其之后聲明的static變量只能賦值,不能訪問。

2)執(zhí)行clinit()方法前,JVM會自動調(diào)用父類的clinit()方法;

3)虛擬機會保證一個類的clinit()在多線程環(huán)境中,自動加鎖、同步。

四、JVM的類加載器

JVM的類加載是通過類加載器實現(xiàn)的,常用的類加載器包括下面三種:

1.啟動類加載器(bootstrap classloader):加載{JDK_HOME}/lib下的類

2.擴展類加載器(extension classloader):加載{JDK_HOME}/lib/ext下的類

3.應(yīng)用程序類加載器(application classloader):加載classpath指定的類

對于不同類加載器以及他們之間的協(xié)作可以參考下面的雙親委派模型。

一文了解JAVA虛擬機的重要組成

 

雙親委派模型的工作過程是:如果一個類加載器收到了類的加載請求,會首先把請求委派給自己的父類,每個層次的類加載器都會如此,因為所有的加載請求最終都會發(fā)送到bootstarp加載器中,只有當父加載器確實無法自己完成加載請求時,子加載器才會嘗試自己加載。

雙親委派模型使得JAVA類能夠按層次進行加載,不會造成混亂。

五、JVM的相關(guān)工具

JDK中有很多強大的監(jiān)控工具,可以直接在命令行運行。這對于在生產(chǎn)環(huán)境進行監(jiān)控是非常有用的。例如SUN JDK中就包含了以下監(jiān)控和故障處理工具。

jps: jvm process status tool,顯示指定系統(tǒng)內(nèi)所有的hotspot虛擬機進程

jstat: jvm statistics monitoring tool,用于收集hotspot虛擬機各方面的運行數(shù)據(jù)

jinfo: configuration info for java,顯示虛擬機配置信息

jmap: memory map for java,生成虛擬機的內(nèi)存轉(zhuǎn)儲快照(heapdump文件)

jhat: jvm heap dump browser,用于分析heapmap文件,它會建立一個http/html服務(wù)器,讓用戶可以在瀏覽器上查看分析結(jié)果

jstack: stack trace for java ,顯示虛擬機的線程快照

責任編輯:武曉燕 來源: 今日頭條
相關(guān)推薦

2020-04-01 22:05:24

虛擬機HotSpotJava

2019-04-13 15:23:48

網(wǎng)絡(luò)模型虛擬機

2022-11-15 16:08:39

2021-01-07 10:04:24

容器虛擬機測試

2019-07-18 15:01:43

Linux虛擬機宿主機

2020-08-27 07:34:50

Zookeeper數(shù)據(jù)結(jié)構(gòu)

2024-02-01 11:57:31

this指針代碼C++

2023-11-20 08:18:49

Netty服務(wù)器

2023-04-26 15:43:24

容器編排容器編排工具

2023-11-06 08:16:19

APM系統(tǒng)運維

2022-06-08 08:11:56

威脅建模網(wǎng)絡(luò)安全網(wǎng)絡(luò)攻擊

2022-11-11 19:09:13

架構(gòu)

2022-02-25 07:34:36

MQTT協(xié)議RabbitMQ

2023-12-26 12:18:02

Java設(shè)計開發(fā)

2023-12-26 07:33:45

Redis持久化COW

2022-10-28 13:48:24

Notebook數(shù)據(jù)開發(fā)機器學習

2024-01-19 11:53:29

文件系統(tǒng)操作系統(tǒng)存儲

2022-02-24 07:34:10

SSL協(xié)議加密

2023-08-26 20:56:02

滑動窗口協(xié)議

2023-11-08 08:15:48

服務(wù)監(jiān)控Zipkin
點贊
收藏

51CTO技術(shù)棧公眾號