JVM基礎(chǔ)(一)

引子


第三行有兩個(gè)單詞需要注意,第一個(gè)是HotSpot,第二個(gè)是Server。

  • HotSpot
    jvm的作用是將cpu看不懂的.class文件變成cpu看的懂的本地代碼。java每次在更新版本的時(shí)候,都需要對(duì)jvm進(jìn)行調(diào)優(yōu),如果jvm頻繁的對(duì).class文件進(jìn)行解析,將浪費(fèi)大量資源。所以,提出了一個(gè)比較好的辦法,那就是HopSpot(熱點(diǎn)追蹤),即對(duì)于一些解析非常頻繁的.class文件,直接保存它解析好的在本地,便不需要浪費(fèi)資源去頻繁解析了。
  • Server
    jvm有兩種模式,一種是Server,一種是Client。Server和Client模式可以在bin中進(jìn)行調(diào)換。他們的差別就是在jvm自動(dòng)分配內(nèi)存的時(shí)候,給Server分配的內(nèi)存要比Client大一些,Client主要是用于桌面應(yīng)用編程的,Server用于并發(fā)編程,所以需要的內(nèi)存要大一些。

jvm結(jié)構(gòu)

Java虛擬機(jī)的基本結(jié)構(gòu)
  • 類加載子系統(tǒng)與方法區(qū)
    類加載子系統(tǒng)負(fù)責(zé)從文件系統(tǒng)或者網(wǎng)絡(luò)中加載class信息,加載的類信息存放于一塊成為方法區(qū)的內(nèi)存空間。除了類的信息外,方法區(qū)中可能還會(huì)存放運(yùn)行時(shí)常量池信息,包括字符串字面量和數(shù)字常量(這部分常量信息是class文件中常量池部分的內(nèi)存映射)。
  • java堆
    java堆在虛擬機(jī)啟動(dòng)的時(shí)候建立,它是java程序最主要的內(nèi)存工作區(qū)域。幾乎所有的java對(duì)象實(shí)例都存放在java堆中。堆空間是所有線程共享的,這是一塊與java應(yīng)用密切相關(guān)的內(nèi)存空間。
  • 直接內(nèi)存
    java的NIO庫(kù)允許java程序使用直接內(nèi)存。直接內(nèi)存是在java堆外的、直接向系統(tǒng)申請(qǐng)的內(nèi)存空間。通常訪問(wèn)直接內(nèi)存的速度會(huì)優(yōu)于java堆。因此出于性能的考慮,讀寫頻繁的場(chǎng)合可能會(huì)考慮使用直接內(nèi)存。由于直接內(nèi)存在java堆外,因此它的大小不會(huì)直接受限于Xmx指定的最大堆大小,但是系統(tǒng)內(nèi)存是有限的,java堆和直接內(nèi)存的總和依然受限于操作系統(tǒng)能給出的最大內(nèi)存。
  • 垃圾回收系統(tǒng)
    垃圾回收系統(tǒng)是java虛擬機(jī)的重要組成部分,垃圾回收器可以對(duì)方法區(qū)、java堆和直接內(nèi)存進(jìn)行回收。其中,java堆是垃圾收集器的工作重點(diǎn)。和c/c++不同,java中所有的對(duì)象空間釋放都是隱式的,也就是說(shuō),java中沒(méi)有類似free()或者delete()這樣的函數(shù)釋放指定的內(nèi)存區(qū)域。對(duì)于不再使用的垃圾對(duì)象,垃圾回收系統(tǒng)會(huì)在后臺(tái)默默工作,默默查找、標(biāo)識(shí)并釋放垃圾對(duì)象,完成包括java堆、方法區(qū)和直接內(nèi)存中的全自動(dòng)化管理。
  • java棧
    每一個(gè)Java虛擬機(jī)線程都有一個(gè)私有的Java棧,一個(gè)線程的Java棧在線程創(chuàng)建的時(shí)候被創(chuàng)建,Java棧中保存著幀信息,Java棧中保存著局部變量、方法參數(shù),同時(shí)和Java方法的調(diào)用、返回密切相關(guān)。
  • 本地方法棧
    本地方法棧和Java棧非常類似,最大的不同在于Java棧用于方法的調(diào)用,而本地方法棧則用于本地方法的調(diào)用,作為對(duì)Java虛擬機(jī)的重要擴(kuò)展,Java虛擬機(jī)允許Java直接調(diào)用本地方法(通常使用c編寫)
  • PC(Program Counter)
    PC寄存器也是每一個(gè)線程私有的空間,Java虛擬機(jī)會(huì)為每一個(gè)Java線程創(chuàng)建PC寄存器。在任意時(shí)刻,一個(gè)Java線程總是在執(zhí)行一個(gè)方法,這個(gè)正在被執(zhí)行的方法稱為當(dāng)前方法。如果當(dāng)前方法不是本地方法,PC寄存器就會(huì)指向當(dāng)前正在被執(zhí)行的指定。如果當(dāng)前方法是本地方法,那么PC寄存器的值就是undefined
  • 執(zhí)行引擎
    執(zhí)行引擎是Java虛擬機(jī)的最核心組件之一,它負(fù)責(zé)執(zhí)行虛擬機(jī)的字節(jié)碼,現(xiàn)代虛擬機(jī)為了提高執(zhí)行效率,會(huì)使用即使編譯(just in time)技術(shù)將方法編譯成機(jī)器碼后再執(zhí)行。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文主要內(nèi)容出自周志明老師《深入理解Java虛擬機(jī)》一書,是筆者結(jié)合自己的理解,提取重點(diǎn),重新組織排版,再補(bǔ)充了一...
    未子涵閱讀 673評(píng)論 0 11
  • 內(nèi)存溢出和內(nèi)存泄漏的區(qū)別 內(nèi)存溢出:out of memory,是指程序在申請(qǐng)內(nèi)存時(shí),沒(méi)有足夠的內(nèi)存空間供其使用,...
    Aimerwhy閱讀 807評(píng)論 0 1
  • 這篇文章是我之前翻閱了不少的書籍以及從網(wǎng)絡(luò)上收集的一些資料的整理,因此不免有一些不準(zhǔn)確的地方,同時(shí)不同JDK版本的...
    高廣超閱讀 16,059評(píng)論 3 83
  • 整理來(lái)自互聯(lián)網(wǎng) 1,JDK:Java Development Kit,java的開(kāi)發(fā)和運(yùn)行環(huán)境,java的開(kāi)發(fā)工具...
    Ncompass閱讀 1,620評(píng)論 0 6
  • 第二部分 自動(dòng)內(nèi)存管理機(jī)制 第二章 java內(nèi)存異常與內(nèi)存溢出異常 運(yùn)行數(shù)據(jù)區(qū)域 程序計(jì)數(shù)器:當(dāng)前線程所執(zhí)行的字節(jié)...
    小明oh閱讀 1,294評(píng)論 0 2

友情鏈接更多精彩內(nèi)容