您好,登錄后才能下訂單哦!
這篇文章主要介紹“Java虛擬機(jī)常見面試題”,在日常操作中,相信很多人在Java虛擬機(jī)常見面試題問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java虛擬機(jī)常見面試題”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
我堅信,機(jī)會永遠(yuǎn)屬于有準(zhǔn)備的人,我們與其羨慕他人的成功,不如從此刻起,積累足夠多的知識和面試經(jīng)驗,為將來進(jìn)入更好的公司做好充分的準(zhǔn)備!想讓面試官在短短的幾十分鐘內(nèi)認(rèn)可你的能力?想在最短的時間內(nèi)收獲 Java 技術(shù)棧最核心的知識點(diǎn)?想要更全面更深入的了解 Java 技術(shù)?這篇文章給你想要的所有答案。
小編分享的這份Java后端開發(fā)面試總結(jié)包含了JavaOOP、Java集合容器、Java異常、并發(fā)編程、Java反射、Java序列化、JVM、Redis、Spring MVC、MyBatis、MySQL數(shù)據(jù)庫、消息中間件MQ、Dubbo、Linux、ZooKeeper、 分布式&數(shù)據(jù)結(jié)構(gòu)與算法等26個專題技術(shù)點(diǎn),都是小編在各個大廠總結(jié)出來的面試真題,已經(jīng)有很多粉絲靠這份PDF拿下眾多大廠的offer,今天在這里總結(jié)分享給到大家!【已完結(jié)】
完整版Java面試題地址:2021最新面試題合集集錦。
序號 | 專題 | 內(nèi)容 | 鏈接 |
---|---|---|---|
1 | 中間件 | Java中間件面試題(2021最新版) | https://my.oschina.net/u/4678580/blog/5012470 |
2 | 微服務(wù) | Java微服務(wù)面試題(2021最新版) | https://my.oschina.net/u/4678580/blog/5014045 |
3 | 并發(fā)編程 | Java并發(fā)編程面試題(2021最新版) | https://my.oschina.net/u/4678580/blog/5017511 |
4 | Java基礎(chǔ) | Java基礎(chǔ)知識面試題(2021最新版) | https://my.oschina.net/u/4678580/blog/5020008 |
5 | Spring Boot | Spring Boot面試題(2021最新版) | https://my.oschina.net/u/4678580/blog/5021192 |
6 | Redis | Redis面試題(2021最新版) | https://my.oschina.net/u/4678580/blog/5022120 |
7 | Spring MVC | Spring MVC面試題(2021最新版) | https://my.oschina.net/u/4678580/blog/5022126 |
8 | Spring Cloud | Spring Cloud面試題(2021最新版) | https://my.oschina.net/u/4678580/blog/5023319 |
9 | MySQL優(yōu)化 | MySQL優(yōu)化面試題(2021最新版) | https://my.oschina.net/u/4678580/blog/5023320 |
10 | JVM | JVM性能調(diào)優(yōu)面試題(2021最新版) | https://my.oschina.net/u/4678580/blog/5023321 |
11 | Linux | Linux面試題(2021最新版) | https://my.oschina.net/u/4678580/blog/5025281 |
12 | Mybatis | Mybatis面試題(2021最新版) | https://my.oschina.net/u/4678580/blog/5025282 |
13 | 網(wǎng)絡(luò)編程 | TCP,UDP,Socket,Http網(wǎng)絡(luò)編程面試題(2021最新版) | https://my.oschina.net/u/4678580/blog/5025284 |
14 | 設(shè)計模式 | 設(shè)計模式面試題(2021最新版) | https://my.oschina.net/u/4678580/blog/5033946 |
15 | 大數(shù)據(jù) | 大數(shù)據(jù)面試題100道(2021最新版) | https://my.oschina.net/u/4678580/blog/5037399 |
16 | Tomcat | Tomcat面試題(2021最新版) | https://my.oschina.net/u/4678580/blog/5034995 |
17 | 多線程 | 多線程面試題(2021最新版) | https://my.oschina.net/u/4678580/blog/5036124 |
18 | Nginx | Nginx_BIO_NIO_AIO面試題(2021最新版) | https://my.oschina.net/u/4678580/blog/5037626 |
19 | memcache | memcache面試題(2021最新版) | https://my.oschina.net/u/4678580/blog/5033471 |
20 | java異常 | java異常面試題(2021最新版) | https://my.oschina.net/u/4678580/blog/5038814 |
21 | Java虛擬機(jī) | Java虛擬機(jī)面試題(2021最新版) | 持續(xù)更新中! |
22 | Java集合 | Java集合面試題(2021最新版) | 持續(xù)更新中! |
23 | Git常用命令 | Git常用命令(2021最新版) | 持續(xù)更新中! |
24 | Elasticsearch | Elasticsearch面試題(2021最新版) | 持續(xù)更新中! |
25 | Dubbo | Dubbo面試題(2021最新版) | 持續(xù)更新中! |
這個夸平臺是中間語言(JVM)實現(xiàn)的夸平臺
Java有JVM從軟件層面屏蔽了底層硬件、指令層面的細(xì)節(jié)讓他兼容各種系統(tǒng)
Jdk包括了Jre和Jvm,Jre包括了Jvm
Jdk是我們編寫代碼使用的開發(fā)工具包
Jre 是Java的運(yùn)行時環(huán)境,他大部分都是 C 和 C++ 語言編寫的,他是我們在編譯java時所需要的基礎(chǔ)的類庫
Jvm俗稱Java虛擬機(jī),他是java運(yùn)行環(huán)境的一部分,它虛構(gòu)出來的一臺計算機(jī),在通過在實際的計算機(jī)上仿真模擬各種計算機(jī)功能來實現(xiàn)Java應(yīng)用程序
看Java官方的圖片,Jdk中包括了Jre,Jre中包括了JVM
Java 虛擬機(jī)在執(zhí)行 Java 程序的過程中會把它所管理的內(nèi)存區(qū)域劃分為若干個不同的數(shù)據(jù)區(qū)域。這些區(qū)域都有各自的用途,以及創(chuàng)建和銷毀的時間,有些區(qū)域隨著虛擬機(jī)進(jìn)程的啟動而存在,有些區(qū)域則是依賴線程的啟動和結(jié)束而建立和銷毀。Java 虛擬機(jī)所管理的內(nèi)存被劃分為如下幾個區(qū)域:
程序計數(shù)器(Program Counter Register):當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器,字節(jié)碼解析器的工作是通過改變這個計數(shù)器的值,來選取下一條需要執(zhí)行的字節(jié)碼指令,分支、循環(huán)、跳轉(zhuǎn)、異常處理、線程恢復(fù)等基礎(chǔ)功能,都需要依賴這個計數(shù)器來完成;為什么要線程計數(shù)器?因為線程是不具備記憶功能
Java 虛擬機(jī)棧(Java Virtual Machine Stacks):每個方法在執(zhí)行的同時都會在Java 虛擬機(jī)棧中創(chuàng)建一個棧幀(Stack Frame)用于存儲局部變量表、操作數(shù)棧、動態(tài)鏈接、方法出口等信息;棧幀就是Java虛擬機(jī)棧中的下一個單位
本地方法棧(Native Method Stack):與虛擬機(jī)棧的作用是一樣的,只不過虛擬機(jī)棧是服務(wù) Java方法的,而本地方法棧是為虛擬機(jī)調(diào)用 Native 方法服務(wù)的;
Native 關(guān)鍵字修飾的方法是看不到的,Native 方法的源碼大部分都是 C和C++ 的代碼
Java 堆(Java Heap):Java 虛擬機(jī)中內(nèi)存最大的一塊,是被所有線程共享的,幾乎所有的對象實例都在這里分配內(nèi)存;
方法區(qū)(Methed Area):用于存儲已被虛擬機(jī)加載的類信息、常量、靜態(tài)變量、即時編譯后的代碼等數(shù)據(jù)。
Java虛擬機(jī)是線程私有的,它的生命周期和線程相同。
虛擬機(jī)棧描述的是Java方法執(zhí)行的內(nèi)存模型: 每個方法在執(zhí)行的同時 都會創(chuàng)建一個棧幀(Stack Frame)用于存儲局部變量表、操作數(shù)棧、動態(tài)鏈接、方法出口等信息。
解釋:虛擬機(jī)棧中是有單位的,單位就是棧幀,一個方法一個棧幀。一個棧幀中他又要存儲,局部變量,操作數(shù)棧,動態(tài)鏈接,出口等。
java堆(Java Heap)是java虛擬機(jī)所管理的內(nèi)存中最大的一塊,是被所有線程共享的一塊內(nèi)存區(qū)域,在虛擬機(jī)啟動時創(chuàng)建。此內(nèi)存區(qū)域的唯一目的就是存放對象實例。
在Java虛擬機(jī)規(guī)范中的描述是:所有的對象實例以及數(shù)組都要在堆上分配。
java堆是垃圾收集器管理的主要區(qū)域,因此也被成為“GC堆”。
從內(nèi)存回收角度來看java堆可分為:新生代和老生代。
從內(nèi)存分配的角度看,線程共享的Java堆中可能劃分出多個線程私有的分配緩沖區(qū)。
無論怎么劃分,都與存放內(nèi)容無關(guān),無論哪個區(qū)域,存儲的都是對象實例,進(jìn)一步的劃分都是為了更好的回收內(nèi)存,或者更快的分配內(nèi)存。
根據(jù)Java虛擬機(jī)規(guī)范的規(guī)定,java堆可以處于物理上不連續(xù)的內(nèi)存空間中。當(dāng)前主流的虛擬機(jī)都是可擴(kuò)展的(通過 -Xmx 和 -Xms 控制)。如果堆中沒有內(nèi)存可以完成實例分配,并且堆也無法再擴(kuò)展時,將會拋出OutOfMemoryError異常。
本地方法棧很好理解,他很棧很像,只不過方法上帶了 native 關(guān)鍵字的棧字
它是虛擬機(jī)棧為虛擬機(jī)執(zhí)行Java方法(也就是字節(jié)碼)的服務(wù)方法
native關(guān)鍵字的方法是看不到的,必須要去oracle官網(wǎng)去下載才可以看的到,而且native關(guān)鍵字修飾的大部分源碼都是C和C++的代碼。
同理可得,本地方法棧中就是C和C++的代碼
方法區(qū)是所有線程共享的內(nèi)存區(qū)域,它用于存儲已被Java虛擬機(jī)加載的類信息、常量、靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據(jù)。
它有個別命叫Non-Heap(非堆)。當(dāng)方法區(qū)無法滿足內(nèi)存分配需求時,拋出OutOfMemoryError異常。
虛擬機(jī)核心的組件就是執(zhí)行引擎,它負(fù)責(zé)執(zhí)行虛擬機(jī)的字節(jié)碼,一般戶先進(jìn)行編譯成機(jī)器碼后執(zhí)行。
“虛擬機(jī)”是一個相對于“物理機(jī)”的概念,虛擬機(jī)的字節(jié)碼是不能直接在物理機(jī)上運(yùn)行的,需要JVM字節(jié)碼執(zhí)行引擎- 編譯成機(jī)器碼后才可在物理機(jī)上執(zhí)行。
直接內(nèi)存(Direct Memory)并不是虛擬機(jī)運(yùn)行時數(shù)據(jù)區(qū)的一部分,也不是Java虛擬機(jī)中定義的內(nèi)存區(qū)域。但是這部分內(nèi)存也被頻繁地使用,而且也可能導(dǎo)致 OutOfMemoryError 異常出現(xiàn),所以我們放到這里一起講解。
我的理解就是直接內(nèi)存是基于物理內(nèi)存和Java虛擬機(jī)內(nèi)存的中間內(nèi)存
程序在運(yùn)行過程中,會產(chǎn)生大量的內(nèi)存垃圾(一些沒有引用指向的內(nèi)存對象都屬于內(nèi)存垃圾,因為這些對象已經(jīng)無法訪問,程序用不了它們了,對程序而言它們已經(jīng)死亡),為了確保程序運(yùn)行時的性能,java虛擬機(jī)在程序運(yùn)行的過程中不斷地進(jìn)行自動的垃圾回收(GC)。
垃圾收集系統(tǒng)是Java的核心,也是不可少的,Java有一套自己進(jìn)行垃圾清理的機(jī)制,開發(fā)人員無需手工清理
有一部分原因就是因為Java垃圾回收系統(tǒng)的強(qiáng)大導(dǎo)致Java領(lǐng)先市場
淺拷貝(shallowCopy)只是增加了一個指針指向已存在的內(nèi)存地址,
深拷貝(deepCopy)是增加了一個指針并且申請了一個新的內(nèi)存,使這個增加的指針指向這個新的內(nèi)存,
淺復(fù)制:僅僅是指向被復(fù)制的內(nèi)存地址,如果原地址發(fā)生改變,那么淺復(fù)制出來的對象也會相應(yīng)的改變。
深復(fù)制:在計算機(jī)中開辟一塊新的內(nèi)存地址用于存放復(fù)制的對象。
內(nèi)存泄漏是指不再被使用的對象或者變量一直被占據(jù)在內(nèi)存中。理論上來說,Java是有GC垃圾回收機(jī)制的,也就是說,不再被使用的對象,會被GC自動回收掉,自動從內(nèi)存中清除。
但是,即使這樣,Java也還是存在著內(nèi)存泄漏的情況,java導(dǎo)致內(nèi)存泄露的原因很明確:長生命周期的對象持有短生命周期對象的引用就很可能發(fā)生內(nèi)存泄露, 盡管短生命周期對象已經(jīng)不再需要,但是因為長生命周期對象持有它的引用而導(dǎo)致不能被回收 ,這就是java中內(nèi)存泄露的發(fā)生場景。
在java中,程序員是不需要顯示的去釋放一個對象的內(nèi)存的,而是由虛擬機(jī)自行執(zhí)行。在JVM中,有一個垃圾回收線程,它是低優(yōu)先級的,在正常情況下是不會執(zhí)行的,只有在虛擬機(jī)空閑或者當(dāng)前堆內(nèi)存不足時,才會觸發(fā)執(zhí)行,掃面那些沒有被任何引用的對象,并將它們添加到要回收的集合中,進(jìn)行回收。
GC 是垃圾收集的意思(Gabage Collection),內(nèi)存處理是編程人員容易出現(xiàn)問題的地方,忘記或者錯誤的內(nèi)存回收會導(dǎo)致程序或系統(tǒng)的不穩(wěn)定甚至崩潰,Java 提供的 GC 功能可以自動監(jiān)測對象是否超過作用域從而達(dá)到自動回收內(nèi)存的目的,Java 語言沒有提供釋放已分配內(nèi)存的顯示操作方法。
優(yōu)點(diǎn):JVM的垃圾回收器都不需要我們手動處理無引用的對象了,這個就是最大的優(yōu)點(diǎn)
缺點(diǎn):程序員不能實時的對某個對象或所有對象調(diào)用垃圾回收器進(jìn)行垃圾回收。
對于GC來說,當(dāng)程序員創(chuàng)建對象時,GC就開始監(jiān)控這個對象的地址、大小以及使用情況。
通常,GC采用有向圖的方式記錄和管理堆(heap)中的所有對象。通過這種方式確定哪些對象是"可達(dá)的",哪些對象是"不可達(dá)的"。當(dāng)GC確定一些對象為"不可達(dá)"時,GC就有責(zé)任回收這些內(nèi)存空間。
可以。程序員可以手動執(zhí)行System.gc(),通知GC運(yùn)行,但是Java語言規(guī)范并不保證GC一定會執(zhí)行。
強(qiáng)引用:發(fā)生 gc 的時候不會被回收。
軟引用:有用但不是必須的對象,在發(fā)生內(nèi)存溢出之前會被回收。
弱引用:有用但不是必須的對象,在下一次GC時會被回收。
虛引用(幽靈引用/幻影引用):無法通過虛引用獲得對象,用 PhantomReference 實現(xiàn)虛引用,虛引用的用途是在 gc 時返回一個通知。
清理整個堆空間—包括年輕代和老年代和永久代
因為Full GC是清理整個堆空間所以Full GC執(zhí)行速度非常慢,在Java開發(fā)中最好保證少觸發(fā)Full GC
當(dāng)對象對當(dāng)前使用這個對象的應(yīng)用程序變得不可觸及的時候,這個對象就可以被回收了。
垃圾回收不會發(fā)生在永久代,如果永久代滿了或者是超過了臨界值,會觸發(fā)完全垃圾回收(Full GC)。如果你仔細(xì)查看垃圾收集器的輸出信息,就會發(fā)現(xiàn)永久代也是被回收的。這就是為什么正確的永久代大小對避免Full GC是非常重要的原因。
標(biāo)記-清除算法:標(biāo)記無用對象,然后進(jìn)行清除回收。缺點(diǎn):效率不高,無法清除垃圾碎片。
復(fù)制算法:按照容量劃分二個大小相等的內(nèi)存區(qū)域,當(dāng)一塊用完的時候?qū)⒒钪膶ο髲?fù)制到另一塊上,然后再把已使用的內(nèi)存空間一次清理掉。缺點(diǎn):內(nèi)存使用率不高,只有原來的一半。
標(biāo)記-整理算法:標(biāo)記無用對象,讓所有存活的對象都向一端移動,然后直接清除掉端邊界以外的內(nèi)存。
分代算法:根據(jù)對象存活周期的不同將內(nèi)存劃分為幾塊,一般是新生代和老年代,新生代基本采用復(fù)制算法,老年代采用標(biāo)記整理算法。
垃圾回收不會發(fā)生在永久代,如果永久代滿了或者是超過了臨界值,會觸發(fā)完全垃圾回收(Full GC)。如果你仔細(xì)查看垃圾收集器的輸出信息,就會發(fā)現(xiàn)永久代也是被回收的。這就是為什么正確的永久代大小對避免Full GC是非常重要的原因。請參考下Java8:從永久代到元數(shù)據(jù)區(qū) (注:Java8中已經(jīng)移除了永久代,新加了一個叫做元數(shù)據(jù)區(qū)的native內(nèi)存區(qū))
Minor GC是新生代GC,指的是發(fā)生在新生代的垃圾收集動作。由于java對象大都是朝生夕死的,所以Minor GC非常頻繁,一般回收速度也比較快。(一般采用復(fù)制算法回收垃圾)
Major GC是老年代GC,指的是發(fā)生在老年代的GC,通常執(zhí)行Major GC會連著Minor GC一起執(zhí)行。Major GC的速度要比Minor GC慢的多。(可采用標(biāo)記清楚法和標(biāo)記整理法)
Full GC是清理整個堆空間,包括年輕代和老年代
如果沒有Survivor,Eden區(qū)每進(jìn)行一次Minor GC,存活的對象就會被送到老年代。老年代很快被填滿,觸發(fā)Major GC.老年代的內(nèi)存空間遠(yuǎn)大于新生代,進(jìn)行一次Full GC消耗的時間比Minor GC長得多,所以需要分為Eden和Survivor。
Survivor的存在意義,就是減少被送到老年代的對象,進(jìn)而減少Full GC的發(fā)生,Survivor的預(yù)篩選保證,只有經(jīng)歷15次Minor GC還能在新生代中存活的對象,才會被送到老年代。
設(shè)置兩個Survivor區(qū)最大的好處就是解決了碎片化,剛剛新建的對象在Eden中,經(jīng)歷一次MinorGC,Eden中的存活對象就會被移動到第一塊survivor space S0,Eden被清空;等Eden區(qū)再滿了,就再觸發(fā)一次Minor GC,Eden和S0中的存活對象又會被復(fù)制送入第二塊survivor spaceS1(這個過程非常重要,因為這種復(fù)制算法保證了S1中來自S0和Eden兩部分的存活對象占用連續(xù)的內(nèi)存空間,避免了碎片化的發(fā)生)
默認(rèn)的,新生代 ( Young ) 與老年代 ( Old ) 的比例的值為 1:2 ( 該值可以通過參數(shù) –XX:NewRatio來指定 ),即:新生代 ( Young ) = 1/3 的堆空間大小。老年代 ( Old ) = 2/3 的堆空間大小。
其中,新生代 ( Young ) 被細(xì)分為 Eden 和 兩個 Survivor 區(qū)域,Edem 和倆個Survivor 區(qū)域比例是 = 8 : 1 : 1 ( 可以通過參數(shù) –XX:SurvivorRatio 來設(shè)定 ),
但是JVM 每次只會使用 Eden 和其中的一塊 Survivor 區(qū)域來為對象服務(wù),所以無論什么時候,總是有一塊 Survivor 區(qū)域是空閑著的。
垃圾收集器是垃圾回收算法(標(biāo)記清楚法、標(biāo)記整理法、復(fù)制算法、分代算法)的具體實現(xiàn),不同垃圾收集器、不同版本的JVM所提供的垃圾收集器可能會有很在差別。
如果說垃圾收集算法是內(nèi)存回收的方法論,那么垃圾收集器就是內(nèi)存回收的具體實現(xiàn)。下圖展示了7種作用于不同分代的收集器,其中用于回收新生代的收集器包括Serial、PraNew、Parallel Scavenge,回收老年代的收集器包括Serial Old、Parallel Old、CMS,還有用于回收整個Java堆的G1收集器。不同收集器之間的連線表示它們可以搭配使用。
Serial收集器(復(fù)制算法): 新生代單線程收集器,標(biāo)記和清理都是單線程,優(yōu)點(diǎn)是簡單高效;
ParNew收集器 (復(fù)制算法): 新生代收并行集器,實際上是Serial收集器的多線程版本,在多核CPU環(huán)境下有著比Serial更好的表現(xiàn);
Parallel Scavenge收集器 (復(fù)制算法): 新生代并行收集器,追求高吞吐量,高效利用 CPU。吞吐量 = 用戶線程時間/(用戶線程時間+GC線程時間),高吞吐量可以高效率的利用CPU時間,盡快完成程序的運(yùn)算任務(wù),適合后臺應(yīng)用等對交互相應(yīng)要求不高的場景;
Serial Old收集器 (標(biāo)記-整理算法): 老年代單線程收集器,Serial收集器的老年代版本;
Parallel Old收集器 (標(biāo)記-整理算法): 老年代并行收集器,吞吐量優(yōu)先,Parallel Scavenge收集器的老年代版本;
CMS(Concurrent Mark Sweep)收集器(標(biāo)記-清除算法): 老年代并行收集器,以獲取最短回收停頓時間為目標(biāo)的收集器,具有高并發(fā)、低停頓的特點(diǎn),追求最短GC回收停頓時間。
G1(Garbage First)收集器 ( 標(biāo)記整理 + 復(fù)制算法來回收垃圾 ): Java堆并行收集器,G1收集器是JDK1.7提供的一個新收集器,G1收集器基于“標(biāo)記-整理”算法實現(xiàn),也就是說不會產(chǎn)生內(nèi)存碎片。此外,G1收集器不同于之前的收集器的一個重要特點(diǎn)是:G1回收的范圍是整個Java堆(包括新生代,老年代),而前六種收集器回收的范圍僅限于新生代或老年代。
Serial / Serial Old Serial / CMS ParNew / Serial Old ParNew / CMS Parallel Scavenge / Serial Old Parallel Scavenge / Parallel Old G1
新生代回收器:Serial、ParNew、Parallel Scavenge
老年代回收器:Serial Old、Parallel Old、CMS
整堆回收器:G1
新生代垃圾回收器一般采用的是復(fù)制算法,復(fù)制算法的優(yōu)點(diǎn)是效率高,缺點(diǎn)是內(nèi)存利用率低;老年代回收器一般采用的是標(biāo)記-整理的算法進(jìn)行垃圾回收。
分代回收器有兩個分區(qū):老生代和新生代,新生代默認(rèn)的空間占比總空間的 1/3,老生代的默認(rèn)占比是 2/3。
新生代使用的是復(fù)制算法,新生代里有 3 個分區(qū):Eden、To Survivor、From Survivor,它們的默認(rèn)占比是 8:1:1,它的執(zhí)行流程如下:
把 Eden + From Survivor 存活的對象放入 To Survivor 區(qū);
清空 Eden 和 From Survivor 分區(qū);
From Survivor 和 To Survivor 分區(qū)交換,F(xiàn)rom Survivor 變 To Survivor,To Survivor 變
From Survivor。
每次在 From Survivor 到 To Survivor 移動時都存活的對象,年齡就 +1,當(dāng)年齡到達(dá) 15(默認(rèn)配置是 15)時,升級為老生代。大對象也會直接進(jìn)入老生代。
老生代當(dāng)空間占用到達(dá)某個值之后就會觸發(fā)全局垃圾收回,一般使用標(biāo)記整理的執(zhí)行算法。以上這些循環(huán)往復(fù)就構(gòu)成了整個分代垃圾回收的整體執(zhí)行流程。
虛擬機(jī)把描述類的數(shù)據(jù)從Class文件加載到內(nèi)存,并對數(shù)據(jù)進(jìn)行校驗,解析和初始化,最終形成可以被虛擬機(jī)直接使用的java類型。
程序主動使用某個類時,如果該類還未被加載到內(nèi)存中,則JVM會通過加載、連接、初始化3個步驟來對該類進(jìn)行初始化。如果沒有意外,JVM將會連續(xù)完成3個步驟,所以有時也把這個3個步驟統(tǒng)稱為類加載或類初始化。
#常用的設(shè)置
-Xms:初始堆大小,JVM 啟動的時候,給定堆空間大小。
-Xmx:最大堆大小,JVM 運(yùn)行過程中,如果初始堆空間不足的時候,最大可以擴(kuò)展到多少。
-Xmn:設(shè)置堆中年輕代大小。整個堆大小=年輕代大小+年老代大小+持久代大小。
-XX:NewSize=n 設(shè)置年輕代初始化大小大小
-XX:MaxNewSize=n 設(shè)置年輕代最大值
-XX:NewRatio=n 設(shè)置年輕代和年老代的比值。如: -XX:NewRatio=3,表示年輕代與年老代比值為 1:3,年輕代占整個年輕代+年老代和的 1/4
-XX:SurvivorRatio=n 年輕代中 Eden 區(qū)與兩個 Survivor 區(qū)的比值。注意 Survivor 區(qū)有兩個。8表示兩個Survivor :eden=2:8 ,即一個Survivor占年輕代的1/10,默認(rèn)就為8
-Xss:設(shè)置每個線程的堆棧大小。JDK5后每個線程 Java 棧大小為 1M,以前每個線程堆棧大小為 256K。
-XX:ThreadStackSize=n 線程堆棧大小
-XX:PermSize=n 設(shè)置持久代初始值
-XX:MaxPermSize=n 設(shè)置持久代大小
-XX:MaxTenuringThreshold=n 設(shè)置年輕帶垃圾對象最大年齡。如果設(shè)置為 0 的話,則年輕代對象不經(jīng)過 Survivor 區(qū),直接進(jìn)入年老代。
#下面是一些不常用的
-XX:LargePageSizeInBytes=n 設(shè)置堆內(nèi)存的內(nèi)存頁大小
-XX:+UseFastAccessorMethods 優(yōu)化原始類型的getter方法性能
-XX:+DisableExplicitGC 禁止在運(yùn)行期顯式地調(diào)用System.gc(),默認(rèn)啟用
-XX:+AggressiveOpts 是否啟用JVM開發(fā)團(tuán)隊最新的調(diào)優(yōu)成果。例如編譯優(yōu)化,偏向鎖,并行年老代收集等,jdk6紙之后默認(rèn)啟動
-XX:+UseBiasedLocking 是否啟用偏向鎖,JDK6默認(rèn)啟用
-Xnoclassgc 是否禁用垃圾回收
-XX:+UseThreadPriorities 使用本地線程的優(yōu)先級,默認(rèn)啟用
-xx:+Use xxx GC
xxx 代表垃圾收集器名稱
-XX:+UseSerialGC:設(shè)置串行收集器,年輕帶收集器
-XX:+UseParNewGC:設(shè)置年輕代為并行收集。可與 CMS 收集同時使用。JDK5.0 以上,JVM 會根據(jù)系統(tǒng)
配置自行設(shè)置,所以無需再設(shè)置此值。
-XX:+UseParallelGC:設(shè)置并行收集器,目標(biāo)是目標(biāo)是達(dá)到可控制的吞吐量
-XX:+UseParallelOldGC:設(shè)置并行年老代收集器,JDK6.0 支持對年老代并行收集。
-XX:+UseConcMarkSweepGC:設(shè)置年老代并發(fā)收集器
-XX:+UseG1GC:設(shè)置 G1 收集器,JDK1.9默認(rèn)垃圾收集器
到此,關(guān)于“Java虛擬機(jī)常見面試題”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。