2-認(rèn)識JVM

轉(zhuǎn)載自:http://www.reibang.com/p/28639d7a00fe


1. 什么是JVM抵怎?

JVM是Java Virtual Machine(Java虛擬機)的縮寫坑填,JVM是一種用于計算設(shè)備的規(guī)范,它是一個虛構(gòu)出來的計算機惊搏,是通過在實際的計算機上仿真模擬各種計算機功能來實現(xiàn)的。Java虛擬機包括一套字節(jié)碼指令集、一組寄存器、一個棧欣舵、一個垃圾回收堆和一個存儲方法域。 JVM屏蔽了與具體操作系統(tǒng)平臺相關(guān)的信息缀磕,使Java程序只需生成在Java虛擬機上運行的目標(biāo)代碼(字節(jié)碼),就可以在多種平臺上不加修改地運行缘圈。JVM在執(zhí)行字節(jié)碼時,實際上最終還是把字節(jié)碼解釋成具體平臺上的機器指令執(zhí)行袜蚕。

Java語言的一個非常重要的特點就是與平臺的無關(guān)性糟把。而使用Java虛擬機是實現(xiàn)這一特點的關(guān)鍵。一般的高級語言如果要在不同的平臺上運行牲剃,至少需要編譯成不同的目標(biāo)代碼遣疯。而引入Java語言虛擬機后,Java語言在不同平臺上運行時不需要重新編譯凿傅。Java語言使用Java虛擬機屏蔽了與具體平臺相關(guān)的信息缠犀,使得Java語言編譯程序只需生成在Java虛擬機上運行的目標(biāo)代碼(字節(jié)碼),就可以在多種平臺上不加修改地運行聪舒。Java虛擬機在執(zhí)行字節(jié)碼時辨液,把字節(jié)碼解釋成具體平臺上的機器指令執(zhí)行。這就是Java的能夠“一次編譯箱残,到處運行”的原因室梅。

2. JRE/JDK/JVM是什么關(guān)系?

JRE(JavaRuntimeEnvironment疚宇,Java運行環(huán)境)亡鼠,也就是Java平臺。所有的Java 程序都要在JRE下才能運行敷待。普通用戶只需要運行已開發(fā)好的java程序间涵,安裝JRE即可。

JDK(Java Development Kit)是程序開發(fā)者用來來編譯榜揖、調(diào)試java程序用的開發(fā)工具包勾哩。JDK的工具也是Java程序抗蠢,也需要JRE才能運行。為了保持JDK的獨立性和完整性思劳,在JDK的安裝過程中迅矛,JRE也是 安裝的一部分。所以潜叛,在JDK的安裝目錄下有一個名為jre的目錄秽褒,用于存放JRE文件。

JVM(JavaVirtualMachine威兜,Java虛擬機)是JRE的一部分销斟。它是一個虛構(gòu)出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現(xiàn)的椒舵。JVM有自己完善的硬件架構(gòu)蚂踊,如處理器、堆棧笔宿、寄存器等犁钟,還具有相應(yīng)的指令系統(tǒng)。Java語言最重要的特點就是跨平臺運行泼橘。使用JVM就是為了支持與操作系統(tǒng)無關(guān)涝动,實現(xiàn)跨平臺。

3. JVM原理

JVM是java的核心和基礎(chǔ)侥加,在java編譯器和os平臺之間的虛擬處理器。它是一種利用軟件方法實現(xiàn)的抽象的計算機基于下層的操作系統(tǒng)和硬件平臺粪躬,可以在上面執(zhí)行java的字節(jié)碼程序担败。

java編譯器只要面向JVM,生成JVM能理解的代碼或字節(jié)碼文件镰官。Java源文件經(jīng)編譯成字節(jié)碼程序提前,通過JVM將每一條指令翻譯成不同平臺機器碼,通過特定平臺運行泳唠。

4. JVM執(zhí)行程序的過程

1) 加載.class文件 2) 管理并分配內(nèi)存 3) 執(zhí)行垃圾收集

JRE(java運行時環(huán)境)由JVM構(gòu)造的java程序的運行環(huán)狈网,也是Java程序運行的環(huán)境,但是他同時一個操作系統(tǒng)的一個應(yīng)用程序一個進程笨腥,因此他也有他自己的運行的生命周期拓哺,也有自己的代碼和數(shù)據(jù)空間。JVM在整個jdk中處于最底層脖母,負(fù)責(zé)于操作系統(tǒng)的交互士鸥,用來屏蔽操作系統(tǒng)環(huán)境,提供一個完整的Java運行環(huán)境谆级,因此也就虛擬計算機烤礁。操作系統(tǒng)裝入JVM是通過jdk中Java.exe來完成讼积,通過下面4步來完成JVM環(huán)境:1) 創(chuàng)建JVM裝載環(huán)境和配置 2) 裝載JVM.dll 3) 初始化JVM.dll并掛界到JNIENV(JNI調(diào)用接口)實例4) 調(diào)用JNIEnv實例裝載并處理class類。

5. JVM的生命周期

1) JVM實例對應(yīng)了一個獨立運行的java程序它是進程級別

a) 啟動脚仔。啟動一個Java程序時勤众,一個JVM實例就產(chǎn)生了,任何一個擁有public static void

main(String[] args)函數(shù)的class都可以作為JVM實例運行的起點

b) 運行鲤脏。main()作為該程序初始線程的起點们颜,任何其他線程均由該線程啟動。JVM內(nèi)部有兩種線程:守護線程和非守護線程凑兰,main()屬于非守護線程掌桩,守護線程通常由JVM自己使用,java程序也可以表明自己創(chuàng)建的線程是守護線程

c) 消亡姑食。當(dāng)程序中的所有非守護線程都終止時波岛,JVM才退出;若安全管理器允許音半,程序也可以使用Runtime類或者System.exit()來退出

2) JVM執(zhí)行引擎實例則對應(yīng)了屬于用戶運行程序的線程它是線程級別的

6. JVM的體系結(jié)構(gòu)

類裝載器(ClassLoader)(用來裝載.class文件)

執(zhí)行引擎(執(zhí)行字節(jié)碼则拷,或者執(zhí)行本地方法)

運行時數(shù)據(jù)區(qū)(方法區(qū)、堆曹鸠、java棧煌茬、PC寄存器、本地方法棧)

7. JVM運行時數(shù)據(jù)區(qū)

第一塊:PC寄存器

PC寄存器是用于存儲每個線程下一步將執(zhí)行的JVM指令彻桃,如該方法為native的坛善,則PC寄存器中不存儲任何信息。

第二塊:JVM棧

JVM棧是線程私有的邻眷,每個線程創(chuàng)建的同時都會創(chuàng)建JVM棧眠屎,JVM棧中存放的為當(dāng)前線程中局部基本類型的變量(java中定義的八種基本類型:boolean、char肆饶、byte改衩、short、int驯镊、long葫督、float、double)板惑、部分的返回結(jié)果以及Stack Frame橄镜,非基本類型的對象在JVM棧上僅存放一個指向堆上的地址。

第三塊:堆(Heap)

它是JVM用來存儲對象實例以及數(shù)組值的區(qū)域冯乘,可以認(rèn)為Java中所有通過new創(chuàng)建的對象的內(nèi)存都在此分配蛉鹿,Heap中的對象的內(nèi)存需要等待GC進行回收。

(1) 堆是JVM中所有線程共享的往湿,因此在其上進行對象內(nèi)存的分配均需要進行加鎖妖异,這也導(dǎo)致了new對象的開銷是比較大的

(2) Sun Hotspot JVM為了提升對象內(nèi)存分配的效率惋戏,對于所創(chuàng)建的線程都會分配一塊獨立的空間TLAB(Thread Local Allocation Buffer),其大小由JVM根據(jù)運行的情況計算而得他膳,在TLAB上分配對象時不需要加鎖响逢,因此JVM在給線程的對象分配內(nèi)存時會盡量的在TLAB上分配,在這種情況下JVM中分配對象內(nèi)存的性能和C基本是一樣高效的棕孙,但如果對象過大的話則仍然是直接使用堆空間分配

(3) TLAB僅作用于新生代的Eden Space舔亭,因此在編寫Java程序時,通常多個小的對象比大的對象分配起來更加高效蟀俊。

(4) 所有新創(chuàng)建的Object 都將會存儲在新生代Yong Generation中钦铺。如果Young Generation的數(shù)據(jù)在一次或多次GC后存活下來,那么將被轉(zhuǎn)移到OldGeneration肢预。新的Object總是創(chuàng)建在Eden Space矛洞。

第四塊:方法區(qū)域(Method Area)

(1)在Sun JDK中這塊區(qū)域?qū)?yīng)的為PermanetGeneration,又稱為持久代烫映。

(2)方法區(qū)域存放了所加載的類的信息(名稱沼本、修飾符等)、類中的靜態(tài)變量锭沟、類中定義為final類型的常量抽兆、類中的Field信息、類中的方法信息族淮,當(dāng)開發(fā)人員在程序中通過Class對象中的getName辫红、isInterface等方法來獲取信息時,這些數(shù)據(jù)都來源于方法區(qū)域祝辣,同時方法區(qū)域也是全局共享的贴妻,在一定的條件下它也會被GC,當(dāng)方法區(qū)域需要使用的內(nèi)存超過其允許的大小時较幌,會拋出OutOfMemory的錯誤信息揍瑟。

第五塊:運行時常量池(Runtime Constant Pool)

存放的為類中的固定的常量信息白翻、方法和Field的引用信息等乍炉,其空間從方法區(qū)域中分配。

第六塊:本地方法堆棧(Native Method Stacks)

JVM采用本地方法堆棧來支持native方法的執(zhí)行滤馍,此區(qū)域用于存儲每個native方法調(diào)用的狀態(tài)岛琼。

8. JVM垃圾回收

GC (Garbage Collection)的基本原理:將內(nèi)存中不再被使用的對象進行回收,GC中用于回收的方法稱為收集器巢株,由于GC需要消耗一些資源和時間槐瑞,Java在對對象的生命周期特征進行分析后,按照新生代阁苞、舊生代的方式來對對象進行收集困檩,以盡可能的縮短GC對應(yīng)用造成的暫停

(1)對新生代的對象的收集稱為minor GC祠挫;

(2)對舊生代的對象的收集稱為Full GC;

(3)程序中主動調(diào)用System.gc()強制執(zhí)行的GC為Full GC悼沿。

不同的對象引用類型等舔, GC會采用不同的方法進行回收,JVM對象的引用分為了四種類型:

(1)強引用:默認(rèn)情況下糟趾,對象采用的均為強引用(這個對象的實例沒有其他對象引用慌植,GC時才會被回收)

(2)軟引用:軟引用是Java中提供的一種比較適合于緩存場景的應(yīng)用(只有在內(nèi)存不夠用的情況下才會被GC)

(3)弱引用:在GC時一定會被GC回收

(4)虛引用:由于虛引用只是用來得知對象是否被GC

對于JVM內(nèi)存配置參數(shù):

-Xmx10240m -Xms10240m -Xmn5120m -XXSurvivorRatio=3

-Xms:初始堆大小

-Xmn:年輕代大小

-XXSurvivorRatio:年輕代中Eden區(qū)與Survivor區(qū)的大小比值

年輕代5120m, Eden:Survivor=3义郑,Survivor區(qū)大小=1024m(Survivor區(qū)有兩個蝶柿,即將年輕代分為5份,每個Survivor區(qū)占一份)非驮,總大小為2048m交汤。

-Xms初始堆大小即最小內(nèi)存值為10240m

主要內(nèi)容來自:baike.baidu.com/link

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市院尔,隨后出現(xiàn)的幾起案子蜻展,更是在濱河造成了極大的恐慌,老刑警劉巖邀摆,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纵顾,死亡現(xiàn)場離奇詭異,居然都是意外死亡栋盹,警方通過查閱死者的電腦和手機施逾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來例获,“玉大人汉额,你說我怎么就攤上這事≌ヌ溃” “怎么了蠕搜?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長收壕。 經(jīng)常有香客問我妓灌,道長,這世上最難降的妖魔是什么蜜宪? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任虫埂,我火速辦了婚禮,結(jié)果婚禮上圃验,老公的妹妹穿的比我還像新娘掉伏。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布斧散。 她就那樣靜靜地躺著供常,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鸡捐。 梳的紋絲不亂的頭發(fā)上话侧,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音闯参,去河邊找鬼瞻鹏。 笑死,一個胖子當(dāng)著我的面吹牛鹿寨,可吹牛的內(nèi)容都是我干的新博。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼脚草,長吁一口氣:“原來是場噩夢啊……” “哼赫悄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起馏慨,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤埂淮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后写隶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體倔撞,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年慕趴,在試婚紗的時候發(fā)現(xiàn)自己被綠了痪蝇。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡冕房,死狀恐怖躏啰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情耙册,我是刑警寧澤给僵,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站详拙,受9級特大地震影響帝际,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望殊霞。 院中可真熱鬧歧蕉,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至冷冗,卻和暖如春守屉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蒿辙。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工拇泛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人思灌。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓俺叭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親泰偿。 傳聞我的和親對象是個殘疾皇子熄守,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載blog.csdn.net/ning109314/article/details/10411495/ JVM工...
    forever_smile閱讀 5,353評論 1 56
  • Java動態(tài)追蹤技術(shù)探究 在Java虛擬機中,字符串常量到底存放在哪 一次生產(chǎn) CPU 100% 排查優(yōu)化實踐 聊...
    passiontim閱讀 4,049評論 0 38
  • Java動態(tài)追蹤技術(shù)探究 在Java虛擬機中耗跛,字符串常量到底存放在哪 一次生產(chǎn) CPU 100% 排查優(yōu)化實踐 聊...
    星海辰光大人閱讀 741評論 0 2
  • 這篇文章是我之前翻閱了不少的書籍以及從網(wǎng)絡(luò)上收集的一些資料的整理裕照,因此不免有一些不準(zhǔn)確的地方,同時不同JDK版本的...
    高廣超閱讀 15,545評論 3 83
  • 工作之余调塌,想總結(jié)一下JVM相關(guān)知識晋南。 Java運行時數(shù)據(jù)區(qū): Java虛擬機在執(zhí)行Java程序的過程中會將其管理的...
    Huang遠(yuǎn)閱讀 629評論 0 2