精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

面試現(xiàn)場(chǎng)——聊聊JVM性能調(diào)優(yōu)?

開(kāi)發(fā) 前端
經(jīng)過(guò)幾天的思考,我決定先更新一些面試中經(jīng)常會(huì)被問(wèn)及的一些知識(shí)點(diǎn),以便能夠幫助小伙伴們系統(tǒng)的梳理面試中需要掌握的知識(shí)技能。

?大家好,我是冰河~~

最近不少小伙伴希望我能寫(xiě)一些關(guān)于面試的知識(shí),出一些相對(duì)來(lái)說(shuō)有一點(diǎn)技術(shù)深度的面試知識(shí)點(diǎn)。

經(jīng)過(guò)幾天的思考,我決定先更新一些面試中經(jīng)常會(huì)被問(wèn)及的一些知識(shí)點(diǎn),以便能夠幫助小伙伴們系統(tǒng)的梳理面試中需要掌握的知識(shí)技能。

主要的方式是以面試的角度,深度聊聊面試中經(jīng)常被問(wèn)及的各項(xiàng)知識(shí)點(diǎn)。

對(duì)于工作3年左右的Java程序員來(lái)說(shuō),在面試大廠(chǎng)的過(guò)程中,面試官可能不會(huì)太關(guān)注你做了多少個(gè)項(xiàng)目、你的CRUD水平如何。更多的是關(guān)注你對(duì)某項(xiàng)技術(shù)點(diǎn)的理解深度,所以說(shuō),工作3年左右的小伙伴一定要把自己的重心放到技術(shù)的深度上來(lái)。

今天,我們先一起聊聊關(guān)于JVM性能調(diào)優(yōu)的話(huà)題,本文的主要結(jié)構(gòu)如下所示。

圖片

常見(jiàn)面試題

關(guān)于JVM,一道常見(jiàn)的面試題就是:Java中創(chuàng)建的對(duì)象是存儲(chǔ)在JVM中的哪個(gè)區(qū)域的?

例如,這里,我們簡(jiǎn)單的列舉一行代碼,如下所示。

User user = new User();

關(guān)于上面的代碼,不少小伙伴都知道,創(chuàng)建出來(lái)的User對(duì)象是放在JVM中的堆區(qū)域的,而User對(duì)象的引用是放在棧中的。但如果你只是了解到這種程度,那面試官就會(huì)認(rèn)為你了解的太淺顯了,可能就會(huì)達(dá)不到他們的要求。其實(shí)面試官想要了解你是否對(duì)JVM有一個(gè)更深入的認(rèn)識(shí)。

站在面試官的角度來(lái)看這個(gè)問(wèn)題時(shí),回答創(chuàng)建出來(lái)的User對(duì)象是放在JVM的堆區(qū),也并沒(méi)有錯(cuò)。但是JVM的堆內(nèi)存區(qū)域又會(huì)分為年輕代和老年代,而年輕代又會(huì)分為Eden區(qū)和Survivor區(qū)。JVM堆空間的邏輯結(jié)構(gòu)如下圖所示。

圖片

而面試官更想了解的是你能不能說(shuō)出來(lái)創(chuàng)建的對(duì)象具體是存放在JVM堆空間的哪個(gè)區(qū)域。

在JVM內(nèi)部,會(huì)將整個(gè)堆空間劃分成年輕代和老年代,年輕代默認(rèn)會(huì)占整個(gè)堆內(nèi)存空間的1/3,老年代默認(rèn)會(huì)占整個(gè)堆內(nèi)存空間的2/3。年輕代又會(huì)劃分為Eden區(qū)和兩個(gè)Survivor區(qū),它們之間的默認(rèn)比例是Eden:Survivor1:Survivor2 = 8:1:1。

圖片

如果你能回答出 新創(chuàng)建的User對(duì)象是存放在JVM堆空間中年輕代的Eden區(qū),那面試官就會(huì)對(duì)你刮目相看了。當(dāng)然,這里沒(méi)有考慮JVM的逃逸分析情況,關(guān)于JVM的逃逸分析,大家可以參考《??逃逸分析??》一文。

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

JVM主要由三個(gè)子系統(tǒng)構(gòu)成,分別為:類(lèi)加載器子系統(tǒng)、運(yùn)行時(shí)數(shù)據(jù)區(qū)(內(nèi)存結(jié)構(gòu))和字節(jié)碼執(zhí)行引擎。

圖片

關(guān)于JVM的體系結(jié)構(gòu)全貌,我們先來(lái)看一張圖。

圖片

當(dāng)我們開(kāi)發(fā)Java程序時(shí),首先會(huì)編寫(xiě).java文件,之后,會(huì)將.java文件編譯成.class文件。

JVM中,會(huì)通過(guò)類(lèi)裝載子系統(tǒng)將.class文件的內(nèi)容裝載到JVM的運(yùn)行時(shí)數(shù)據(jù)區(qū),而JVM的運(yùn)行時(shí)數(shù)據(jù)區(qū)又會(huì)分為:方法區(qū)、堆、棧、本地方法棧和程序計(jì)數(shù)器 幾個(gè)部分。

在裝載class文件的內(nèi)容時(shí),會(huì)將class文件的內(nèi)容拆分為幾個(gè)部分,分別裝載到JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)的幾個(gè)部分。其中,值得注意的是:程序計(jì)數(shù)器的作用是:記錄程序執(zhí)行的下一條指令的地址。

方法區(qū)也叫作元空間,主要包含了:運(yùn)行時(shí)常量池、類(lèi)型信息、字段信息、方法信息、類(lèi)加載器的引用、對(duì)應(yīng)的Class實(shí)例的引用等信息。

在JVM中,程序的執(zhí)行是通過(guò)執(zhí)行引擎進(jìn)行的,執(zhí)行引擎會(huì)調(diào)用本地方法的接口來(lái)執(zhí)行本地方法庫(kù),進(jìn)而完成整個(gè)程序邏輯的執(zhí)行。

我們常說(shuō)的垃圾收集器是包含在執(zhí)行引擎中的,在程序的運(yùn)行過(guò)程中,執(zhí)行引擎會(huì)開(kāi)啟垃圾收集器,并在后臺(tái)運(yùn)行,垃圾收集器會(huì)不斷監(jiān)控程序運(yùn)行過(guò)程中產(chǎn)生的內(nèi)存垃圾信息,并根據(jù)相應(yīng)的策略對(duì)垃圾信息進(jìn)行清理。

這里,大家需要注意的是:棧、本地方法棧和程序計(jì)數(shù)器是每個(gè)線(xiàn)程運(yùn)行時(shí)獨(dú)占的,而方法區(qū)和堆是所有線(xiàn)程共享的。所以,棧、本地方法棧和程序計(jì)數(shù)器不會(huì)涉及線(xiàn)程安全問(wèn)題,而方法區(qū)和堆會(huì)涉及線(xiàn)程安全問(wèn)題。

方法區(qū)(元空間)

很多小伙伴一看到方法區(qū)三個(gè)字,腦海中的第一印象可能是存儲(chǔ)方法的地方吧。

實(shí)則不然,方法區(qū)的另一個(gè)名字叫作元空間,相信不少小伙伴或多或少的聽(tīng)說(shuō)過(guò)元空間。這個(gè)區(qū)域是JDK1.8中劃分出來(lái)的。主要包含:運(yùn)行時(shí)常量池、類(lèi)型信息、字段信息、方法信息、類(lèi)加載器的引用、對(duì)應(yīng)的Class實(shí)例的引用等信息。方法區(qū)中的信息能夠被多個(gè)線(xiàn)程共享。

例如,在程序中聲明的常量、靜態(tài)變量和有關(guān)于類(lèi)的信息等的引用,都會(huì)存放在方法區(qū),而這些引用所指向的具體對(duì)象 一般都會(huì)在堆中開(kāi)辟單獨(dú)的空間進(jìn)行存儲(chǔ),也可能會(huì)在直接內(nèi)存中進(jìn)行存儲(chǔ)。

圖片

堆中主要存儲(chǔ)的是實(shí)際創(chuàng)建的對(duì)象,也就是會(huì)存儲(chǔ)通過(guò)new關(guān)鍵字創(chuàng)建的對(duì)象,堆中的對(duì)象能夠被多個(gè)線(xiàn)程共享。堆中的數(shù)據(jù)不需要事先明確生存期,可以動(dòng)態(tài)的分配內(nèi)存,不再使用的數(shù)據(jù)和對(duì)象由JVM中的GC機(jī)制自動(dòng)回收。對(duì)JVM的性能調(diào)優(yōu)一般就是對(duì)堆內(nèi)存的調(diào)優(yōu)。

Java中基本類(lèi)型的包裝類(lèi):Byte、Short、Integer、Long、Float、Double、Boolean、Character類(lèi)型的數(shù)據(jù)是存儲(chǔ)在堆中的。

堆一般會(huì)被分成年輕代和老年代。而年輕代又會(huì)被進(jìn)一步分為1個(gè)Eden區(qū)和2個(gè)Survivor區(qū)。在內(nèi)存分配上,如果保持默認(rèn)配置的話(huà),年輕代和老年代的內(nèi)存大小比例為1 : 2,年輕代中的1個(gè)Eden區(qū)和2個(gè)Survivor區(qū)的內(nèi)存大小比例為:8 : 1 : 1。

圖片

棧一般又叫作線(xiàn)程棧或虛擬機(jī)棧,一般存儲(chǔ)的是局部變量。在Java中,每個(gè)線(xiàn)程都會(huì)有一個(gè)單獨(dú)的棧區(qū),每個(gè)棧中的元素都是私有的,不會(huì)被其他的棧所訪(fǎng)問(wèn)。棧中的數(shù)據(jù)大小和生存期都是確定的,存取速度比較快。

在Java中,所有的基本數(shù)據(jù)類(lèi)型(byte、short、int、long、float、double、boolean、char)和引用變量(對(duì)象引用)都是在棧中的。一般情況下,線(xiàn)程退出或者方法退出時(shí),棧中的數(shù)據(jù)會(huì)被自動(dòng)清除。

程序在執(zhí)行過(guò)程中,會(huì)在棧中為不同的方法創(chuàng)建不同的棧幀,在棧幀中又包含了:局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接和方法出口。?

圖片

關(guān)于局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接和方法出口的具體作用,會(huì)在《架構(gòu)師進(jìn)階系列》中的后續(xù)文章中詳細(xì)闡述。

棧中一般會(huì)存儲(chǔ)對(duì)象的引用,這些引用所指向的具體對(duì)象一般都會(huì)在堆中開(kāi)辟單獨(dú)的地址空間進(jìn)行存儲(chǔ),也有可能存儲(chǔ)在直接內(nèi)存中。

圖片

注意:?這里說(shuō)的是這些引用所指向的具體對(duì)象一般都會(huì)在堆中開(kāi)辟單獨(dú)的地址空間進(jìn)行存儲(chǔ),也有可能存儲(chǔ)在直接內(nèi)存中。

因?yàn)樵贘VM中,如果開(kāi)啟了逃逸分析和標(biāo)量替換,則可能不會(huì)再在堆上創(chuàng)建對(duì)象,可能會(huì)將對(duì)象直接分配到棧上,也可能不再創(chuàng)建對(duì)象,而是進(jìn)一步分解對(duì)象中的成員變量,將其直接在棧上分配空間并賦值。?

本地方法棧

本地方法棧相對(duì)來(lái)說(shuō)比較簡(jiǎn)單,就是保存native方法進(jìn)入?yún)^(qū)域的地址。

例如,在Java中創(chuàng)建線(xiàn)程,調(diào)用Thread對(duì)象的start()方法時(shí),會(huì)通過(guò)本地方法start0()調(diào)用操作系統(tǒng)創(chuàng)建線(xiàn)程的方法。此時(shí),本地方法棧就會(huì)保存start0()方法進(jìn)入?yún)^(qū)域的內(nèi)存地址。

程序計(jì)數(shù)器

程序計(jì)數(shù)器也叫作PC計(jì)數(shù)器,只要存儲(chǔ)的是下一條將要執(zhí)行的命令的地址。

雙親委派機(jī)制

何為雙親委派?

JVM中是通過(guò)類(lèi)的雙親委派機(jī)制來(lái)加載的,那什么是雙親委派機(jī)制呢?我們先來(lái)看一張圖。

圖片

當(dāng)JVM加載某個(gè)類(lèi)的時(shí)候,不會(huì)直接使用當(dāng)前類(lèi)的加載器加載該類(lèi),會(huì)先委托父加載器尋找要加載的目標(biāo)類(lèi),找不到再委托上層的父加載器進(jìn)行加載,直到引導(dǎo)類(lèi)加載器同樣找不到要加載的目標(biāo)類(lèi),就會(huì)在自己的類(lèi)加載路徑中查找并加載目標(biāo)類(lèi)。

簡(jiǎn)單來(lái)說(shuō):雙親委派機(jī)制就是:先使用父加載器加載,如果父加載器找不到要加載的目標(biāo)類(lèi),就使用子加載器自己加載。

為何使用雙親委派機(jī)制?

這里,小伙伴們有沒(méi)有想過(guò)這樣一個(gè)問(wèn)題:JVM為何要使用雙親委派機(jī)制呢?

為了更好的說(shuō)明問(wèn)題,我們自己創(chuàng)建一個(gè)java.lang?包,并在java.lang包下,創(chuàng)建一個(gè)String類(lèi),如下所示。

package java.lang;

/**
* @author binghe (公眾號(hào):冰河技術(shù))
* @version 1.0.0
* @description 測(cè)試時(shí)雙親委派機(jī)制
*/
public class String {
public static void main(String[] args){
System.out.println("自定義的String類(lèi)");
}
}

這里,我們自己創(chuàng)建一個(gè)java.lang.String?類(lèi),而JDK中也存在一個(gè)java.lang.String?類(lèi),如果運(yùn)行我們自己創(chuàng)建的java.lang.String會(huì)發(fā)生什么呢?會(huì)輸出如下錯(cuò)誤信息。

錯(cuò)誤: 在類(lèi) java.lang.String 中找不到 main 方法, 請(qǐng)將 main 方法定義為:
public static void main(String[] args)
否則 JavaFX 應(yīng)用程序類(lèi)必須擴(kuò)展javafx.application.Application

那JVM為何要使用雙親委派機(jī)制呢?試想,如果我們自己寫(xiě)的類(lèi)能夠隨隨便便覆蓋JDK中的類(lèi)的話(huà),那JDK中的代碼是不是就沒(méi)有任何安全性可言了?沒(méi)錯(cuò),JVM為了代碼的安全性,也即是沙箱安全機(jī)制,使用了雙親委派機(jī)制。

另外,使用雙親委派機(jī)制,也能防止JVM內(nèi)存中出現(xiàn)多份相同的字節(jié)碼。例如,兩個(gè)類(lèi)A和B,都需要加載System類(lèi)。如果JVM沒(méi)有提供雙親委派機(jī)制,那么A和B兩個(gè)類(lèi)就會(huì)分別加載一份System的字節(jié)碼,這樣JVM內(nèi)存中就會(huì)出現(xiàn)這份System字節(jié)碼。

相反,JVM提供了雙親委派機(jī)制的話(huà),在加載System類(lèi)的過(guò)程中,會(huì)遞歸的向父加載器查找并加載,整個(gè)過(guò)程會(huì)優(yōu)先選用BootStrapClassLoader加載器,也就是我們通常說(shuō)的引導(dǎo)類(lèi)加載器。如果找不到就逐級(jí)向下使用子加載器進(jìn)行加載。

而System類(lèi)可以在BootStrapClassLoader中進(jìn)行加載,如果System類(lèi)已經(jīng)通過(guò)A類(lèi)的引用加載過(guò),此時(shí)B類(lèi)也要加載System類(lèi),也會(huì)從BootStrapClassLoader開(kāi)始加載System類(lèi),此時(shí),BootStrapClassLoader發(fā)現(xiàn)已經(jīng)加載過(guò)System類(lèi)了,就會(huì)直接返回內(nèi)存中的System,不再重新加載。

這樣,在JVM內(nèi)存中,就只會(huì)存在一份System類(lèi)的字節(jié)碼。

類(lèi)加載器的父子關(guān)系

如何確認(rèn)類(lèi)加載器的父子關(guān)系呢?這里,我們?cè)賮?lái)看一個(gè)示例代碼,如下所示。

/**
* @author binghe (公眾號(hào):冰河技術(shù))
* @version 1.0.0
* @description 類(lèi)的雙親委派機(jī)制
*/
public class User {
public static void main(String[] args){
User user = new User();
System.out.println(user.getClass().getClassLoader());
System.out.println(user.getClass().getClassLoader().getParent());
System.out.println(user.getClass().getClassLoader().getParent().getParent());
}
}

這段代碼也比較簡(jiǎn)單,創(chuàng)建了一個(gè)User對(duì)象,打印User對(duì)象的類(lèi)加載器,父類(lèi)加載和上層父加載器。在IDEA中運(yùn)行上述代碼,會(huì)輸出如下信息。

sun.misc.Launcher$AppClassLoader@18b4aac2
sun.misc.Launcher$ExtClassLoader@135fbaa4
null

可以看到,User對(duì)象的類(lèi)加載器是AppClassLoader,父加載器是ExtClassLoader。而輸出的null其實(shí)是BootStrapClassLoader,而B(niǎo)ootStrapClassLoader也就是上層父加載器。

這樣,類(lèi)加載器的父子關(guān)系就出來(lái)了:AppClassLoader的父加載器是ExtClassLoader,ExtClassLoader的父加載器是BootStrapClassLoader。

這里,需要注意的是:父加載器并不是父類(lèi)。

類(lèi)加載器加載的類(lèi)

  • 引導(dǎo)類(lèi)加載器(BootStrapClassLoader):負(fù)責(zé)加載%JAVA_HOME%/jre/lib目錄下的所有jar包,或者是-Xbootclasspath參數(shù)指定的路徑;
  • 擴(kuò)展類(lèi)加載器(ExtClassLoader):負(fù)責(zé)加載%JAVA_HOME%/jre/lib/ext目錄下的所有jar包,或者是java.ext.dirs參數(shù)指定的路徑;
  • 應(yīng)用類(lèi)加載器(AppClassLoader):負(fù)責(zé)加載用戶(hù)類(lèi)路徑上所指定的類(lèi)庫(kù)。

注意:引導(dǎo)類(lèi)加載器和擴(kuò)展類(lèi)加載器加載的類(lèi)都是預(yù)先加載好的,而應(yīng)用類(lèi)加載器用來(lái)加載應(yīng)用工程的classes以及l(fā)ib下的類(lèi)庫(kù),僅僅聲明,并不會(huì)提前載入JVM內(nèi)存,等到使用的時(shí)候才會(huì)加載到JVM內(nèi)存中。

類(lèi)的加載過(guò)程

一個(gè)類(lèi)在JVM中的加載過(guò)程大致經(jīng)歷了加載、驗(yàn)證、準(zhǔn)備、解析和初始化。

  • 加載:主要是在計(jì)算機(jī)磁盤(pán)上通過(guò)IO流讀取字節(jié)碼文件(.class文件),當(dāng)程序需要使用某個(gè)類(lèi)時(shí),才會(huì)對(duì)這個(gè)類(lèi)進(jìn)行加載操作,比如,在程序中調(diào)用某個(gè)類(lèi)的靜態(tài)方法,使用new關(guān)鍵字創(chuàng)建某個(gè)類(lèi)的對(duì)象等。在加載階段,往往會(huì)在JVM的堆內(nèi)存中生成一個(gè)代表這個(gè)類(lèi)的Class對(duì)象,這個(gè)對(duì)象作為存放在JVM方法區(qū)中這個(gè)類(lèi)的各種數(shù)據(jù)的訪(fǎng)問(wèn)入口,也可以叫做訪(fǎng)問(wèn)句柄。
  • 驗(yàn)證 :主要的作用就是校驗(yàn)字節(jié)碼的正確性,是否符合JVM規(guī)范。
  • 準(zhǔn)備: 為類(lèi)的靜態(tài)變量分配相應(yīng)的內(nèi)存,并賦予默認(rèn)值。
  • 解析:將程序中的符號(hào)引用替換為直接引用,這里的符號(hào)引用包括:靜態(tài)方法等。此階段就是將一些靜態(tài)方法等符號(hào)引用替換成指向數(shù)據(jù)所在內(nèi)存地址的指針,這些指針就是直接引用。如果是在類(lèi)加載過(guò)程中完成的符號(hào)引用到直接引用的替換,這個(gè)替換的過(guò)程就叫作靜態(tài)鏈接過(guò)程。如果是在運(yùn)行期間完成的符號(hào)引用到直接引用的替換,這個(gè)替換的過(guò)程就叫作動(dòng)態(tài)鏈接過(guò)程。
  • 初始化:對(duì)類(lèi)的靜態(tài)變量進(jìn)行初始化,為其賦予程序中指定的值,并執(zhí)行靜態(tài)代碼塊中的代碼。

注意:在準(zhǔn)備階段和初始化階段都會(huì)為類(lèi)的靜態(tài)變量賦值,不同之處就是在準(zhǔn)備階段為類(lèi)的靜態(tài)變量賦予的是默認(rèn)值,而在初始化階段為類(lèi)的靜態(tài)變量賦予的是真正要賦予的值。

例如,在程序中有如下靜態(tài)變量。

public static int count = 100;

在準(zhǔn)備階段會(huì)為count賦予一個(gè)默認(rèn)值0,而在初始化階段才會(huì)真正將count賦值為100。

JVM調(diào)優(yōu)參數(shù)

在JVM中,主要是對(duì)堆(新生代)、方法區(qū)和棧進(jìn)行性能調(diào)優(yōu)。各個(gè)區(qū)域的調(diào)優(yōu)參數(shù)如下所示。

  • 堆:-Xms、-Xmx
  • 新生代:-Xmn
  • 方法區(qū)(元空間):-XX:MetaspaceSize、-XX:MaxMetaspaceSize
  • 棧(線(xiàn)程):-Xss

為了更加直觀(guān)的表述,我們可以將JVM的內(nèi)存區(qū)域和對(duì)應(yīng)的調(diào)優(yōu)參數(shù)總結(jié)成下圖所示。

圖片

在設(shè)置JVM啟動(dòng)參數(shù)時(shí),需要特別注意方法區(qū)(元空間)的參數(shù)設(shè)置。

關(guān)于方法區(qū)(元空間)的JVM參數(shù)主要有兩個(gè):-XX:MetaspaceSize和-XX:MaxMetaspaceSize。

-XX:MetaspaceSize:指的是方法區(qū)(元空間)觸發(fā)Full GC的初始內(nèi)存大小(方法區(qū)沒(méi)有固定的初始內(nèi)存大小),以字節(jié)為單位,默認(rèn)為21M。達(dá)到設(shè)置的值時(shí),會(huì)觸發(fā)Full GC,同時(shí)垃圾收集器會(huì)對(duì)這個(gè)值進(jìn)行修改。

如果在發(fā)生Full GC時(shí),回收了大量?jī)?nèi)存空間,則垃圾收集器會(huì)適當(dāng)降低此值的大小;如果在發(fā)生Full GC時(shí),釋放的空間比較少,則在不超過(guò)設(shè)置的-XX:MetaspaceSize值或者在沒(méi)設(shè)置-XX:MetaspaceSize的值時(shí)不超過(guò)21M,適當(dāng)提高此值。

-XX:MaxMetaspaceSize:指的是方法區(qū)(元空間)的最大值,默認(rèn)值為-1,不受堆內(nèi)存大小限制,此時(shí),只會(huì)受限于本地內(nèi)存大小。

最后需要注意的是:調(diào)整方法區(qū)(元空間)的大小會(huì)發(fā)生Full GC,這種操作的代價(jià)是非常昂貴的。如果發(fā)現(xiàn)應(yīng)用在啟動(dòng)的時(shí)候發(fā)生了Full GC,則很有可能是方法區(qū)(元空間)的大小被動(dòng)態(tài)調(diào)整了。

所以,為了盡量不讓JVM動(dòng)態(tài)調(diào)整方法區(qū)(元空間)的大小造成頻繁的Full GC,一般將-XX:MetaspaceSize和-XX:MaxMetaspaceSize設(shè)置成一樣的值。例如,物理內(nèi)存8G,可以將這兩個(gè)值設(shè)置為256M?

最后,我們一起看下在物理內(nèi)存8G的情況下,啟動(dòng)應(yīng)用程序時(shí),可以設(shè)置的JVM參數(shù)。當(dāng)然,我這里給出的是一些經(jīng)驗(yàn)值,實(shí)際部署到生產(chǎn)環(huán)境時(shí),需要經(jīng)過(guò)壓測(cè)找到最佳的參數(shù)值。

  • 啟動(dòng)SpringBoot

java ‐Xms2048M ‐Xmx2048M ‐Xmn1024M ‐Xss512K ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M ‐jar xxx.jar

  • 啟動(dòng)Tomcat(Linux)

在Tomcat bin目錄下catalina.sh文件里配置。

‐Xms2048M ‐Xmx2048M ‐Xmn1024M ‐Xss512K ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M

  • 啟動(dòng)Tomcat(Windows)

在Tomcat bin目錄下catalina.bat文件里配置。

‐Xms2048M ‐Xmx2048M ‐Xmn1024M ‐Xss512K ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M

總結(jié)

本文以面試為背景,探討了有關(guān)JVM的常見(jiàn)面試問(wèn)題。文章開(kāi)頭以一個(gè)常見(jiàn)的面試題舉例,說(shuō)明了JVM在互聯(lián)網(wǎng)大廠(chǎng)面試中的重要性。接下里,介紹了JVM的體系結(jié)構(gòu),包含:方法區(qū)(元空間)、堆、棧、本地方法棧和程序計(jì)數(shù)器。

隨后,介紹了JVM中的雙親委派機(jī)制,說(shuō)明了何為雙親委派,為何使用雙親委派機(jī)制,類(lèi)加載器的父子關(guān)系。需要注意的是:這里說(shuō)的類(lèi)加載器的父子關(guān)系并不是父類(lèi)和子類(lèi)的關(guān)系。隨后,介紹了各個(gè)類(lèi)加載器要加載哪些類(lèi)。

接下來(lái),介紹了類(lèi)的加載過(guò)程,主要包含:加載、驗(yàn)證、準(zhǔn)備、解析和初始化等步驟,同時(shí),說(shuō)明了各個(gè)步驟的主要作用。

最后,介紹了JVM中常用的調(diào)優(yōu)參數(shù),涵蓋堆、新生代、方法區(qū)(元空間)和棧(線(xiàn)程)常用的調(diào)優(yōu)參數(shù)。并以Tomcat調(diào)優(yōu)為例,詳細(xì)說(shuō)明了如何使用這些調(diào)優(yōu)參數(shù)。

說(shuō)了這么多你都掌握了嗎?

責(zé)任編輯:姜華 來(lái)源: 冰河技術(shù)
相關(guān)推薦

2021-12-06 11:03:57

JVM性能調(diào)優(yōu)

2017-07-21 08:55:13

TomcatJVM容器

2024-12-04 15:49:29

2012-01-10 14:35:08

JavaJVM

2024-10-15 08:37:08

2019-02-19 10:25:28

JVM性能工具

2019-11-01 08:49:07

JVM監(jiān)控性能

2020-11-09 07:34:49

JVM性能監(jiān)控

2023-11-11 19:07:23

JVMJava

2024-05-21 09:08:57

JVM調(diào)優(yōu)面試

2024-09-02 08:53:44

2010-09-27 10:20:09

JVMLinux

2010-09-26 13:39:46

JVM調(diào)優(yōu)

2012-01-10 15:13:56

JavaJVM

2010-09-26 09:08:17

JVM調(diào)優(yōu)

2012-06-20 11:05:47

性能調(diào)優(yōu)攻略

2021-03-04 08:39:21

SparkRDD調(diào)優(yōu)

2017-09-22 15:15:23

jvm調(diào)優(yōu)命令

2017-10-17 14:02:30

jvm調(diào)優(yōu)工具

2021-06-03 08:32:18

JVM調(diào)優(yōu)虛擬機(jī)
點(diǎn)贊
收藏

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

人人草在线观看| 性高潮久久久久久| 日韩有码电影| 亚洲综合不卡| 少妇高潮久久77777| 污版视频在线观看| 欧美黑人猛交| 久久久噜噜噜久久人人看| 国产精品视频专区| 欧美成人片在线观看| 欧美三级午夜理伦三级在线观看| 色综合色综合色综合| 亚洲人成人77777线观看| 国产高中女学生第一次| 欧美天堂亚洲电影院在线观看| 亚洲精品一线二线三线无人区| 久热免费在线观看| 五月天激情在线| 国产性天天综合网| 懂色中文一区二区三区在线视频| 日本中文字幕第一页| 你懂的国产精品| 亚洲人成电影网站| 欧美xxxxx少妇| 巨大黑人极品videos精品| 亚洲观看高清完整版在线观看| 先锋影音网一区| 色欲av永久无码精品无码蜜桃| 理论片日本一区| 51视频国产精品一区二区| 天天天天天天天天操| 俺要去色综合狠狠| 亚洲国产精品一区二区三区| 天堂在线中文在线| 日本美女久久| 欧美性生交xxxxx久久久| 久久中文精品视频| 蜜桃精品成人影片| 波多野结衣在线高清| 中文字幕的久久| 久久久久久久久久久久久久一区| www.色视频| 韩国三级在线一区| 国产精品久久久久77777| 日本a在线观看| 亚洲欧美文学| 国产亚洲精品久久久久久牛牛 | 国产一区二区在线网站| 四虎884aa成人精品| 免费污视频在线一区| 精品成人久久av| 欧美精品久久久久久久自慰 | 亚洲色图欧美偷拍| 亚洲精品在线免费看| 中文字幕人妻一区二区三区视频| 久久av一区| 91国内揄拍国内精品对白| 欧美xxxxx精品| 中文字幕日韩在线| 日韩欧美一区在线| 中文字幕 欧美 日韩| 欧美大片91| 日韩精品一区二区三区在线| 一个人看的视频www| 国产午夜亚洲精品一级在线| 91精品国产手机| 亚洲精品一二三四| 99国产精品免费网站| 精品国产99国产精品| 亚洲精品国产成人av在线| 加勒比色老久久爱综合网| 亚洲黄页视频免费观看| 色综合久久五月| 国产91精品对白在线播放| 亚洲欧美日韩网| 手机看片国产日韩| 99久久久久| 欧美精品一区二区免费| 美女露出粉嫩尿囗让男人桶| 亚洲日本天堂| 在线免费不卡电影| 91国内在线播放| 99久久免费精品国产72精品九九| 亚洲精品国产免费| 怡红院一区二区三区| 99久久久久| 午夜精品理论片| 无码人妻丰满熟妇区五十路| 久久精品国产一区二区三| 91福利入口| 日韩av资源| 亚洲欧洲日韩综合一区二区| 久操网在线观看| 成人午夜在线| 亚洲成人1234| 日韩免费成人av| 欧美日韩亚洲一区二区三区在线| 8x拔播拔播x8国产精品| 中文字幕人妻精品一区| 国产精品一区二区在线播放| 日本欧美一二三区| 在线视频1卡二卡三卡| 成人性生交大片免费看中文 | 无码av免费一区二区三区试看 | 成人午夜视频免费观看| 国产在线精彩视频| 欧美精品视频www在线观看| avtt中文字幕| 久久亚洲国产| 在线观看欧美成人| 欧美精品xxxxx| 日日夜夜免费精品| 欧美亚洲国产视频| 亚洲一级在线播放| 91在线国产福利| 亚洲一二三区精品| 色偷偷偷在线视频播放| 欧美一卡在线观看| 国产一区二区三区四区在线| 亚洲日本成人| 999视频在线观看| 狠狠人妻久久久久久| 国产老妇另类xxxxx| 日本一区二区三区免费看| 大黄网站在线观看| 日韩一区二区在线看片| 少妇一级黄色片| 午夜一级在线看亚洲| 鬼打鬼之黄金道士1992林正英| 91短视频版在线观看www免费| 91蝌蚪国产九色| 黄色片免费在线观看视频| 国产亚洲精彩久久| 亚洲另类图片色| 国产性xxxx高清| 久久av一区| 精品久久sese| a'aaa级片在线观看| 日韩一区二区在线免费观看| www.99re6| 美女一区二区视频| 日韩av一区二区三区美女毛片| 91禁在线看| 精品国产a毛片| 日韩欧美激情视频| 成人爱爱电影网址| 精品免费久久久久久久| 亚洲成人偷拍| 欧美激情精品久久久久久免费印度| 国产精品久久久久久久一区二区 | 国产亚洲免费的视频看| 日本韩国欧美中文字幕| 三级在线观看一区二区| 久久婷婷国产综合尤物精品| 麻豆视频在线看| 亚洲精品理论电影| 日韩欧美三级在线观看| 91麻豆成人久久精品二区三区| 久久久999免费视频| 亚洲妇女av| 欧美中文在线免费| 亚洲视屏在线观看| 国产精品一区二区男女羞羞无遮挡| 亚洲国产一区在线| 色噜噜成人av在线| 欧美成人a视频| 免费视频网站www| 丰满亚洲少妇av| 亚洲不卡中文字幕无码| 日韩电影不卡一区| 日本最新高清不卡中文字幕| 川上优的av在线一区二区| 欧美日韩美少妇| 印度午夜性春猛xxx交| 国产一区二区成人久久免费影院| 青青草影院在线观看| 国产美女视频一区二区| 国外色69视频在线观看| 青青色在线视频| 欧美日韩不卡视频| 久久精品国产亚洲av麻豆色欲 | 国产蜜臀一区二区打屁股调教| 精品国产精品网麻豆系列| 久久国产黄色片| 国产精品嫩草影院com| 无码人妻少妇色欲av一区二区| 亚洲人www| 亚洲人成人77777线观看| av成人男女| 国产成人亚洲综合91| 成人日韩欧美| 欧美性色黄大片手机版| 亚洲精品久久一区二区三区777| 亚洲视频www| 在线观看一区二区三区三州| 免费v片在线观看| 色综久久综合桃花网| 成 人 免费 黄 色| 日韩欧美福利视频| 黄色一级大片在线免费观看| 国产精品中文在线| 天堂网中文字幕| 亚洲人一二三区| 偷偷色噜狠狠狠狠的777米奇| 日韩福利电影在线| 99热久久这里只有精品| 日韩理论在线| 极品校花啪啪激情久久| 亚洲成人毛片| 日本一区二区在线免费播放| 手机在线免费观看av| 怡红院精品视频| 天天干天天做天天操| 欧美福利电影网| 一二三区免费视频| 香蕉加勒比综合久久| 三级影片在线看| 中文av一区特黄| 精品无码在线视频| 成人午夜激情影院| 激情文学亚洲色图| 日韩电影网1区2区| 青娱乐自拍偷拍| 在线成人av| 国产一二三四五| 色综合咪咪久久网| 欧美一区二区三区四区在线观看地址| 粉嫩av一区二区| 91在线观看免费观看| 国产精品99精品一区二区三区∴| 亲爱的老师9免费观看全集电视剧| 亚洲男同gay网站| 伦伦影院午夜日韩欧美限制| 亚洲搞黄视频| 中文字幕最新精品| 丁香婷婷在线| 国产一区二区三区视频| 蜜桃视频在线入口www| 日韩精品免费在线视频| 人人妻人人澡人人爽精品日本| 欧美一区二区三区免费大片| 国产精品特级毛片一区二区三区| 欧美三级欧美一级| 黄色一区二区视频| 欧美综合亚洲图片综合区| 在线观看中文字幕视频| 欧美日韩精品二区| 日韩免费不卡视频| 激情成人在线视频| 亚洲天堂一区在线| 色综合久久中文字幕| 中文字幕一区在线播放| 日韩欧美中文字幕在线播放| 激情五月婷婷网| 欧美综合一区二区| 在线观看国产成人| 欧美疯狂性受xxxxx喷水图片| 97人妻精品一区二区三区动漫 | 国产又爽又黄又嫩又猛又粗| 欧美精品久久久久久久久老牛影院| 亚洲天堂网视频| 777亚洲妇女| 性做久久久久久久久久| 欧美精品一区二区在线播放| 香蕉视频黄在线观看| 亚洲欧美资源在线| 亚洲欧美视频一区二区| 九九热99久久久国产盗摄| 久久大胆人体| 欧美在线一级视频| 成人全视频在线观看在线播放高清 | 亚洲国产精品一区二区第一页| 久久免费精品视频在这里| 先锋影音男人资源| 亚洲图片在线| 日韩精品一区中文字幕| 精品一区二区三区在线视频| 欧美国产日韩在线视频| av一区二区久久| 久久久久亚洲av无码a片| 中文字幕日本不卡| 久一区二区三区| 色先锋资源久久综合| 国产精品伦一区二区三区| 欧美精品一区二区三区高清aⅴ| 青青草视频在线观看| www.欧美三级电影.com| jizz一区二区三区| 国产精品久久久久aaaa九色| 日本在线视频一区二区三区| 蜜桃网站成人| 1024精品久久久久久久久| 男女视频网站在线观看| 麻豆精品在线看| 无码国产精品一区二区免费式直播| 国产亚洲综合av| 强行糟蹋人妻hd中文| 一本久道久久综合中文字幕 | 精品一区二区成人精品| 成人区人妻精品一区二| 国产精品天天看| 成人精品免费在线观看| 欧美一级日韩一级| 国产福利小视频在线| 欧美激情手机在线视频 | 国模套图日韩精品一区二区| 成人黄色短视频在线观看| 久久人人爽人人爽人人片av不| 亚洲欧美国产一区二区| 一本久道久久久| 天天爽夜夜爽视频| 国产欧美精品国产国产专区| 五月激情五月婷婷| 本田岬高潮一区二区三区| 黄色av免费播放| 精品免费在线视频| 精品人妻无码一区二区三区蜜桃一| 亚洲三级黄色在线观看| 国产第一页在线| 亚洲tv在线观看| 日韩欧美视频| 久久黄色免费看| 99久免费精品视频在线观看 | 婷婷六月综合网| 国产高清第一页| 日韩视频免费中文字幕| 二吊插入一穴一区二区| 国产999精品| 成人精品动漫一区二区三区| 自拍偷拍99| 奇米一区二区三区| 精品国产成人亚洲午夜福利| 天天色综合天天| 欧美亚洲精品在线观看| 欧美日韩成人在线观看| 欧美午夜在线播放| 亚洲一区二区在线观| 免费观看30秒视频久久| 无码少妇精品一区二区免费动态| 欧美色播在线播放| 天天操天天干天天爽| 欧美激情欧美狂野欧美精品| 午夜电影一区| 无码人妻精品一区二区蜜桃网站| 国产一区二区精品久久99| 四虎永久免费在线| 欧美一区二区在线看| 操你啦在线视频| 91精品综合视频| 91不卡在线观看| 国产九九九视频| 亚洲精品视频免费看| www.色呦呦| 国产69精品久久久久9| 久久99精品久久久久久欧洲站| 国产精品自拍片| 91网上在线视频| 尤物视频免费观看| 最近的2019中文字幕免费一页 | www.欧美日本韩国| 91在线观看免费观看| 国模大胆一区二区三区| 成年女人免费视频| 五月婷婷综合激情| 青青草在线免费观看| 国产精品高潮视频| 日韩欧美二区| 亚洲精品鲁一鲁一区二区三区| 亚洲成年人网站在线观看| 凸凹人妻人人澡人人添| 国产v综合v亚洲欧美久久| 波多野结衣一区| 无码国产精品一区二区高潮| 亚洲国产精品一区二区久久| 免费理论片在线观看播放老| 国产精品香蕉av| 欧美xxx在线观看| 青青草视频成人| 欧美日韩亚洲综合一区二区三区| av大大超碰在线| 久久国产精品 国产精品| 日av在线不卡| 欧美成人黄色网| 亚洲欧美国产日韩天堂区| 久久爱.com| 人体内射精一区二区三区| 久久久国产午夜精品| 国产又粗又猛又爽又黄91| 欧美激情免费视频| 国产一卡不卡| 26uuu国产| 欧美在线视频你懂得| 色呦呦在线看| 日韩国产精品一区二区三区| 国产乱对白刺激视频不卡| 精品人妻一区二区三区潮喷在线 | 国产麻豆成人传媒免费观看| 男人的天堂一区二区| 中文字幕亚洲无线码a| 电影一区二区在线观看|