欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

首頁綜合 正文
目錄

柚子快報(bào)邀請(qǐng)碼778899分享:JVM學(xué)習(xí)筆記(一)

柚子快報(bào)邀請(qǐng)碼778899分享:JVM學(xué)習(xí)筆記(一)

http://yzkb.51969.com/

1 JVM 加載 class 文件的原理機(jī)制

JVM(Java Virtual Machine,Java虛擬機(jī))加載class文件的原理機(jī)制主要包括以下幾個(gè)步驟:

加載(Loading):JVM通過類的全名獲取定義此類的二進(jìn)制字節(jié)流,然后將這個(gè)字節(jié)流所代表的靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu),最后在堆中生成一個(gè)代表這個(gè)類的Class對(duì)象,作為方法區(qū)這些數(shù)據(jù)的訪問入口。加載過程主要由類加載器完成,包括啟動(dòng)類加載器、擴(kuò)展類加載器和應(yīng)用程序類加載器等。類加載器采用雙親委派模型,即先讓父類加載器嘗試加載,只有當(dāng)父類加載器無法完成時(shí)才由自己加載。鏈接(Linking):鏈接包括驗(yàn)證、準(zhǔn)備和解析三個(gè)階段。驗(yàn)證是為了確保被加載的類文件信息符合JVM規(guī)范,無安全方面的問題;準(zhǔn)備是給類的靜態(tài)變量分配內(nèi)存,并設(shè)置默認(rèn)的初始值;解析是將符號(hào)引用轉(zhuǎn)換為直接引用。初始化(Initialization):初始化階段是執(zhí)行類構(gòu)造器方法(())的過程。此方法由編譯器自動(dòng)收集類中的所有類變量的賦值動(dòng)作和靜態(tài)代碼塊集合來的。類構(gòu)造器方法中的指令按語句在源文件中出現(xiàn)的順序執(zhí)行。

在JVM中,類的加載過程具有動(dòng)態(tài)性,即并不是一次性加載所有類,而是按需加載。當(dāng)一個(gè)類被使用時(shí),才會(huì)被加載到內(nèi)存中。這種動(dòng)態(tài)加載的方式有助于節(jié)省內(nèi)存資源,提高程序的運(yùn)行效率。

JVM(Java虛擬機(jī))加載class文件的原理機(jī)制是一個(gè)復(fù)雜的過程,它確保了Java應(yīng)用程序的正常運(yùn)行。以下是該過程的基本概述:

裝載工作:Java中的所有類,在能夠被JVM執(zhí)行之前,必須被裝載到JVM中。這個(gè)裝載工作是由JVM中的類裝載器(ClassLoader)及其子類來完成的。類裝載器的主要工作就是將類文件從硬盤讀取到內(nèi)存中。類裝載器的層級(jí)結(jié)構(gòu):在JVM中,類裝載器之間存在層級(jí)關(guān)系。當(dāng)JVM需要加載某個(gè)類時(shí),會(huì)首先委托給父類裝載器去嘗試加載。如果父類裝載器無法加載這個(gè)類,那么子類裝載器才會(huì)嘗試去加載。這就是類裝載器的“委托機(jī)制”。此外,子類裝載器可以看見所有父類裝載器加載的類,但父類裝載器無法看見子類裝載器加載的類,這是“可見性原理”。同時(shí),由于委托機(jī)制的存在,一個(gè)類只會(huì)被加載一次,這保證了類的“單一性”。類的加載方式:類的加載方式主要有兩種:隱式加載和顯式加載。隱式加載通常發(fā)生在程序運(yùn)行過程中,當(dāng)碰到需要通過new等方式生成對(duì)象時(shí),JVM會(huì)隱式調(diào)用類裝載器加載對(duì)應(yīng)的類。而顯式加載則是通過諸如Class.forName()等方法,顯式地請(qǐng)求加載某個(gè)類。類的加載過程:當(dāng)JVM加載class文件時(shí),首先會(huì)讀取文件中的數(shù)據(jù),通常是通過創(chuàng)建一個(gè)字節(jié)數(shù)組來讀入.class文件,然后產(chǎn)生與所加載類對(duì)應(yīng)的Class對(duì)象。此時(shí),Class對(duì)象還不完整,需要經(jīng)過連接階段,包括驗(yàn)證、準(zhǔn)備(為靜態(tài)變量分配內(nèi)存并設(shè)置默認(rèn)的初始值)和解析(將符號(hào)引用替換為直接引用)三個(gè)步驟。最后,JVM對(duì)類進(jìn)行初始化,包括初始化父類(如果存在)以及執(zhí)行類中的初始化語句。動(dòng)態(tài)性體現(xiàn):Java程序在啟動(dòng)時(shí),并不是一次性將所有類全部加載到JVM中,而是先將保證程序運(yùn)行的基礎(chǔ)類加載進(jìn)來,其他類則等到JVM在運(yùn)行時(shí)用到的時(shí)候再進(jìn)行加載。這種按需加載的方式,有效地節(jié)省了內(nèi)存開銷,體現(xiàn)了JVM加載class文件的動(dòng)態(tài)性。

總的來說,JVM加載class文件的原理機(jī)制是一個(gè)涉及類裝載器、類的層級(jí)結(jié)構(gòu)、加載方式、加載過程以及動(dòng)態(tài)性等多個(gè)方面的復(fù)雜過程。這個(gè)過程的目的是確保Java程序能夠在JVM上正確、高效地運(yùn)行。

2 JVM運(yùn)行時(shí)五大數(shù)據(jù)區(qū)

JVM(Java虛擬機(jī))運(yùn)行時(shí)數(shù)據(jù)區(qū)主要分為以下五個(gè)區(qū)域:

方法區(qū)(Method Area):

方法區(qū)是所有線程共享的內(nèi)存區(qū)域,用于存儲(chǔ)已被虛擬機(jī)加載的類信息、常量、靜態(tài)變量、即時(shí)編譯器編譯后的代碼等數(shù)據(jù)。這個(gè)區(qū)域又被稱為非堆(Non-Heap),目的是與Java堆進(jìn)行區(qū)分。方法區(qū)無法滿足內(nèi)存分配需求時(shí),會(huì)拋出OutOfMemoryError異常。 堆(Java Heap):

堆也是所有線程共享的一塊內(nèi)存區(qū)域,它是JVM所管理的最大一塊內(nèi)存區(qū)域。堆主要用于存放對(duì)象實(shí)例,幾乎所有的對(duì)象實(shí)例都會(huì)在這里分配內(nèi)存。Java堆是垃圾收集器管理的主要區(qū)域,因此很多時(shí)候也被稱做“GC堆”。堆可以細(xì)分為新生代和老年代;其中新生代又可以進(jìn)一步細(xì)分為Eden區(qū)和Survivor區(qū)(包括From Survivor和To Survivor)。 虛擬機(jī)棧(Java Virtual Machine Stacks):

每個(gè)線程在創(chuàng)建時(shí)都會(huì)創(chuàng)建一個(gè)虛擬機(jī)棧,其內(nèi)部保存一個(gè)個(gè)的棧幀(Stack Frame),對(duì)應(yīng)著一次次的Java方法調(diào)用。每一個(gè)方法被調(diào)用直至執(zhí)行完成的過程,對(duì)應(yīng)著一個(gè)棧幀在虛擬機(jī)棧中入棧到出棧的過程。棧幀中存儲(chǔ)了局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接、方法出口等信息。每一個(gè)方法被調(diào)用時(shí)都會(huì)創(chuàng)建一個(gè)新的棧幀,用于存儲(chǔ)局部變量、操作棧、常量池引用等信息。每一個(gè)方法調(diào)用完成后,對(duì)應(yīng)的棧幀隨之銷毀。 本地方法棧(Native Method Stacks):

本地方法棧與虛擬機(jī)棧所發(fā)揮的作用非常相似,其區(qū)別不過是虛擬機(jī)棧為虛擬機(jī)執(zhí)行Java方法(字節(jié)碼)服務(wù),而本地方法棧則為虛擬機(jī)使用到的Native方法服務(wù)。在HotSpot虛擬機(jī)中,本地方法棧和虛擬機(jī)棧是合二為一的。 程序計(jì)數(shù)器(Program Counter Register):

程序計(jì)數(shù)器是一塊較小的內(nèi)存空間,可以看作是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器。字節(jié)碼解釋器工作時(shí),就是通過改變這個(gè)計(jì)數(shù)器的值來選取下一條需要執(zhí)行的字節(jié)碼指令。分支、循環(huán)、跳轉(zhuǎn)、異常處理、線程恢復(fù)等基礎(chǔ)功能都需要依賴這個(gè)計(jì)數(shù)器來完成。由于Java虛擬機(jī)的多線程是通過線程輪流切換并分配處理器執(zhí)行時(shí)間的方式來實(shí)現(xiàn)的,在任何一個(gè)確定的時(shí)刻,一個(gè)處理器只會(huì)執(zhí)行一條線程中的指令。因此,為了線程切換后能恢復(fù)到正確的執(zhí)行位置,每條線程都需要有一個(gè)獨(dú)立的程序計(jì)數(shù)器,各條線程之間的計(jì)數(shù)器互不影響,獨(dú)立存儲(chǔ),我們稱這類內(nèi)存區(qū)域?yàn)椤熬€程私有”的內(nèi)存。如果線程正在執(zhí)行的是一個(gè)Java方法,這個(gè)計(jì)數(shù)器記錄的是正在執(zhí)行的虛擬機(jī)字節(jié)碼指令的地址;如果正在執(zhí)行的是Native方法,這個(gè)計(jì)數(shù)器的值則為空(Undefined)。此內(nèi)存區(qū)域是唯一一個(gè)在Java虛擬機(jī)規(guī)范中沒有規(guī)定任何OutOfMemoryError情況的區(qū)域。

這些區(qū)域各自承載著不同的任務(wù),協(xié)同工作以支持Java應(yīng)用程序的運(yùn)行。

3 JVM垃圾回收算法

JVM(Java Virtual Machine)垃圾回收算法是Java內(nèi)存管理的重要組成部分,用于自動(dòng)回收不再使用的對(duì)象,釋放內(nèi)存空間。以下是JVM中常見的幾種垃圾回收算法:

標(biāo)記-清除算法(Mark-Sweep Algorithm) 這是最基本的垃圾回收算法。它分為兩個(gè)階段:標(biāo)記階段和清除階段。在標(biāo)記階段,垃圾回收器會(huì)從根對(duì)象(如靜態(tài)變量、棧中的引用等)開始,遞歸地訪問所有可達(dá)的對(duì)象,并標(biāo)記它們?yōu)榇婊?。在清除階段,垃圾回收器會(huì)遍歷整個(gè)堆內(nèi)存,回收未被標(biāo)記(即不可達(dá))的對(duì)象。 優(yōu)點(diǎn):實(shí)現(xiàn)簡單,不需要移動(dòng)對(duì)象,因此效率較高。 缺點(diǎn):會(huì)產(chǎn)生內(nèi)存碎片,導(dǎo)致分配大對(duì)象時(shí)可能需要提前觸發(fā)垃圾回收。 復(fù)制算法(Copying Algorithm) 為了解決標(biāo)記-清除算法的內(nèi)存碎片問題,復(fù)制算法將內(nèi)存劃分為兩個(gè)等大小的區(qū)域。在任意時(shí)間點(diǎn),只有其中一個(gè)區(qū)域被使用,另一個(gè)區(qū)域是空閑的。當(dāng)進(jìn)行垃圾回收時(shí),存活的對(duì)象會(huì)被復(fù)制到空閑區(qū)域,然后整個(gè)使用過的區(qū)域會(huì)被一次性清理掉。 優(yōu)點(diǎn):不會(huì)產(chǎn)生內(nèi)存碎片,且對(duì)象復(fù)制過程中可以按內(nèi)存塊順序進(jìn)行,效率較高。 缺點(diǎn):內(nèi)存使用效率較低,因?yàn)橹挥幸话氲膬?nèi)存是可用的。另外,當(dāng)存活對(duì)象較多時(shí),復(fù)制開銷會(huì)較大。 標(biāo)記-整理算法(Mark-Compact Algorithm) 標(biāo)記-整理算法是標(biāo)記-清除算法的改進(jìn)版。它在標(biāo)記存活對(duì)象的基礎(chǔ)上,將所有存活的對(duì)象都移動(dòng)到一端,然后直接清理掉邊界以外的內(nèi)存。這樣可以避免內(nèi)存碎片問題,同時(shí)也不需要像復(fù)制算法那樣浪費(fèi)一半的內(nèi)存空間。 優(yōu)點(diǎn):解決了內(nèi)存碎片問題,且內(nèi)存使用效率較高。 缺點(diǎn):對(duì)象移動(dòng)的開銷較大,尤其是在存活對(duì)象較多的情況下。此外,如果大多數(shù)對(duì)象都是存活的,那么這種算法的效率會(huì)較低。 分代收集算法(Generational Collection Algorithm) 分代收集算法是根據(jù)對(duì)象存活周期的不同將內(nèi)存劃分為幾塊的思想。一般將堆區(qū)劃分為老年代和新生代,新生代中的對(duì)象大多數(shù)很快就會(huì)成為垃圾被回收,而老年代中的對(duì)象存活時(shí)間較長。針對(duì)不同區(qū)域可以使用最適合的收集算法以提高效率。例如,新生代可以使用復(fù)制算法,而老年代可以使用標(biāo)記-清除或標(biāo)記-整理算法。 優(yōu)點(diǎn):可以根據(jù)不同區(qū)域的對(duì)象特性采用最合適的垃圾回收算法,從而提高垃圾回收效率。 缺點(diǎn):需要維護(hù)多個(gè)內(nèi)存區(qū)域,增加了內(nèi)存管理的復(fù)雜性。同時(shí),對(duì)于跨代引用(如老年代對(duì)象引用新生代對(duì)象)的處理也會(huì)增加一定的開銷。

4 JVM垃圾收集器

JVM(Java Virtual Machine)常用的垃圾回收器有以下幾種:

Serial收集器:

最古老的垃圾回收器,采用單線程進(jìn)行垃圾回收。在回收過程中會(huì)暫停所有的應(yīng)用線程(Stop-The-World),因此適用于小型的應(yīng)用場景或者對(duì)停頓時(shí)間沒有嚴(yán)格要求的情況。 Parallel收集器(也稱為Parallel Scavenge):

是Serial收集器的改進(jìn)版,使用多線程進(jìn)行垃圾回收。同樣會(huì)在回收過程中暫停所有的應(yīng)用線程,但利用多核CPU的并行處理能力來提高回收效率,適用于多核CPU的服務(wù)器應(yīng)用場景。 CMS(Concurrent Mark Sweep)收集器:

是一種以獲取最短回收停頓時(shí)間為目標(biāo)的垃圾回收器,使用多線程進(jìn)行垃圾回收。在回收過程中只暫停少量的應(yīng)用線程,大部分回收工作與應(yīng)用線程并發(fā)進(jìn)行,適用于響應(yīng)時(shí)間敏感的應(yīng)用場景。缺點(diǎn)是會(huì)產(chǎn)生內(nèi)存碎片,并且無法處理浮動(dòng)垃圾(在并發(fā)標(biāo)記階段新產(chǎn)生的垃圾對(duì)象)。 G1(Garbage-First)收集器:

是一款面向服務(wù)器的垃圾收集器,主要針對(duì)配備多顆處理器及大容量內(nèi)存的機(jī)器。以極高概率滿足GC停頓時(shí)間要求的同時(shí),還具備高吞吐量性能特征。G1收集器將整個(gè)Java堆劃分為多個(gè)獨(dú)立的塊(Region),根據(jù)各個(gè)塊中垃圾對(duì)象數(shù)量的多少和回收預(yù)期停頓時(shí)間的長短來優(yōu)先回收垃圾對(duì)象最多的塊,從而達(dá)到高效回收的目的。

這些垃圾回收器各有優(yōu)缺點(diǎn),適用于不同的應(yīng)用場景和需求。在選擇垃圾回收器時(shí),需要根據(jù)具體的應(yīng)用特點(diǎn)、性能要求和硬件環(huán)境來進(jìn)行權(quán)衡和選擇。

5 JVM垃圾回收對(duì)應(yīng)算法

當(dāng)然,不同的垃圾回收器在JVM中采用了不同的回收算法。以下是常見垃圾回收器及其所采用的回收算法的簡要概述:

Serial收集器:

回收算法:復(fù)制算法。特點(diǎn):Serial收集器是一個(gè)單線程的收集器,它在進(jìn)行垃圾收集時(shí),必須暫停所有用戶線程。它主要針對(duì)于新生代的垃圾收集,老年代則使用其他收集器(如Serial Old)。 Parallel Scavenge收集器:

回收算法:復(fù)制算法。特點(diǎn):Parallel Scavenge是一個(gè)新生代的多線程收集器,與Serial收集器類似,但它利用多個(gè)線程并行地進(jìn)行垃圾收集,從而提高了效率。此收集器的主要目標(biāo)是達(dá)到一個(gè)可控的吞吐量。 ParNew收集器:

回收算法:復(fù)制算法。特點(diǎn):ParNew收集器是Serial收集器的多線程版本。它在進(jìn)行垃圾收集時(shí),也是使用多個(gè)線程,從而減少了垃圾收集時(shí)的停頓時(shí)間。ParNew收集器通常與CMS收集器一起搭配使用,用于新生代的垃圾收集。 CMS(Concurrent Mark Sweep)收集器:

回收算法:標(biāo)記-清除算法。特點(diǎn):CMS收集器是一個(gè)老年代的并發(fā)收集器,它使用多線程進(jìn)行垃圾收集,并且盡可能地減少停頓時(shí)間。CMS收集器分為初始標(biāo)記、并發(fā)標(biāo)記、重新標(biāo)記和并發(fā)清除四個(gè)步驟。其中,初始標(biāo)記和重新標(biāo)記階段會(huì)暫停用戶線程,但這兩個(gè)階段的時(shí)間相對(duì)較短。 G1(Garbage-First)收集器:

回收算法:G1收集器采用了一種混合的收集策略,它結(jié)合了標(biāo)記-清除、標(biāo)記-整理和復(fù)制算法。特點(diǎn):G1收集器將整個(gè)堆內(nèi)存劃分為多個(gè)獨(dú)立的塊(Region),并且根據(jù)每個(gè)塊中垃圾對(duì)象的數(shù)量和回收預(yù)期停頓時(shí)間的長短來優(yōu)先回收垃圾對(duì)象最多的塊。G1收集器旨在滿足高吞吐量的同時(shí),也提供可預(yù)測的停頓時(shí)間。

需要注意的是,垃圾回收器的選擇和配置應(yīng)根據(jù)具體的應(yīng)用場景、性能要求和硬件環(huán)境來進(jìn)行權(quán)衡和選擇。不同的垃圾回收器和算法在不同的場景下可能表現(xiàn)出不同的性能和效果。

6 JVM參數(shù)

標(biāo)準(zhǔn)參數(shù)

1 ‐version

2 ‐help

3 ‐server

4 ‐cp

些參數(shù)是JVM各版本中基本不會(huì)發(fā)生變化的參數(shù),例如-version、-help等。它們提供了基本的運(yùn)行時(shí)選項(xiàng)和功能,且相對(duì)穩(wěn)定。

非標(biāo)準(zhǔn)參數(shù)

-X

1 ‐Xint 解釋執(zhí)行

2 ‐Xcomp 第一次使用就編譯成本地代碼

3 ‐Xmixed 混合模式,JVM自己來決定

非標(biāo)準(zhǔn)參數(shù)(-X參數(shù)):這類參數(shù)的變化比較小,并且默認(rèn)jvm實(shí)現(xiàn)這些參數(shù)的功能,但是并不保證所有jvm實(shí)現(xiàn)都滿足,且不保證向后兼容。這些參數(shù)主要用于JVM的調(diào)試和優(yōu)化,如-Xint、-Xcomp和-Xmixed等。其中,-Xint表示解釋執(zhí)行,-Xcomp表示第一次使用就編譯成本地代碼,而-Xmixed表示采用混合模式,由JVM自動(dòng)選擇解釋執(zhí)行或編譯成本地代碼。

-XX

1 a.Boolean類型

2 格式:‐XX:[+‐] +或‐表示啟用或者禁用name屬性

3 比如:‐XX:+UseConcMarkSweepGC 表示啟用CMS類型的垃圾回收器

4 ‐XX:+UseG1GC 表示啟用G1類型的垃圾回收器

5 b.非Boolean類型

6 格式:‐XX=表示name屬性的值是value

7 比如:‐XX:MaxGCPauseMillis=500

-XX:NewRatio:指定新生代和老年代的比例,例如-XX:NewRatio=4表示新生代和老年代的比例為1:4。(hotspot默認(rèn)2)

-XX:SurvivorRatio:指定新生代中Eden區(qū)和Survivor區(qū)的比例,例如-XX:SurvivorRatio=8表示Eden區(qū)和Survivor區(qū)的比例為8:2(hostspot默認(rèn)8)

-XX:+PrintGC:開啟打印GC日志信息,以便分析和調(diào)優(yōu)垃圾收集性能。

-Xloggc: 參數(shù)可以指定 GC 日志的輸出文件。例如:-Xloggc:/path/to/gc.log

在較新的 JVM 版本中(如 Java 9 及以后),可以使用統(tǒng)一的日志系統(tǒng)參數(shù) -Xlog 來配置日志,包括 GC 日志。例如:-Xlog:gc*:file=/path/to/gc.log。這將配置 GC 日志并指定輸出文件。

-XX:+HeapDumpOnOutOfMemoryError:當(dāng)發(fā)生OutOfMemoryError時(shí),自動(dòng)生成堆轉(zhuǎn)儲(chǔ)文件,以便分析內(nèi)存泄漏等問題。

-XX:HeapDumpPath= 參數(shù)可以指定堆轉(zhuǎn)儲(chǔ)文件的輸出路徑。例如:-XX:HeapDumpPath=/path/to/dumps/。

非Stable參數(shù)(-XX參數(shù)):這類參數(shù)主要用于JVM的高級(jí)調(diào)優(yōu)和Debug,變化相對(duì)較大,不建議在生產(chǎn)環(huán)境中使用。這類參數(shù)主要可以分為Boolean類型和非Boolean類型。Boolean類型的參數(shù)格式如-XX:+

-D

-D 是一個(gè) Java 虛擬機(jī)(JVM)的非標(biāo)準(zhǔn)參數(shù),它用于設(shè)置系統(tǒng)屬性值。這些屬性可以在 Java 程序中通過 System.getProperty() 方法進(jìn)行訪問。屬性名通常是一些有特定意義的字符串,屬性值可以是任意字符串或其他數(shù)據(jù)類型。通過 -D 參數(shù),我們可以在啟動(dòng) Java 應(yīng)用程序時(shí)為其配置一些運(yùn)行時(shí)的環(huán)境或行為。

例如,我們可以使用 -Dfile.encoding=UTF-8 來設(shè)置 Java 程序的默認(rèn)文件編碼為 UTF-8。這將在程序運(yùn)行期間影響文件的讀寫操作。需要注意的是,-D 參數(shù)設(shè)置的屬性值對(duì)整個(gè) Java 應(yīng)用程序都是可見的,因此應(yīng)該謹(jǐn)慎使用,避免引入不必要的副作用或安全隱患。

其他參數(shù)

1 ‐Xms1000M等價(jià)于 ‐XX:InitialHeapSize=1000M

2 ‐Xmx1000M等價(jià)于 ‐XX:MaxHeapSize=1000M

3 ‐Xss100等價(jià)于 ‐XX:ThreadStackSize=100

常見參數(shù) 官網(wǎng): https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html

柚子快報(bào)邀請(qǐng)碼778899分享:JVM學(xué)習(xí)筆記(一)

http://yzkb.51969.com/

參考文章

評(píng)論可見,查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。

轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://gantiao.com.cn/post/19257862.html

發(fā)布評(píng)論

您暫未設(shè)置收款碼

請(qǐng)?jiān)谥黝}配置——文章設(shè)置里上傳

掃描二維碼手機(jī)訪問

文章目錄