1.JVM的類(lèi)加載機(jī)制是什么?有哪些實(shí)現(xiàn)方式?
類(lèi)加載機(jī)制:
類(lèi)的加載指的是將類(lèi)的.class文件中的二進(jìn)制數(shù)據(jù)讀入到內(nèi)存中,將其放在運(yùn)行時(shí)數(shù)據(jù)區(qū)的方法去內(nèi),然后在堆區(qū)創(chuàng)建一個(gè)java.lang.Class對(duì)象,用來(lái)封裝在方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu)。類(lèi)的加載最終是在堆區(qū)內(nèi)的Class對(duì)象,Class對(duì)象封裝了類(lèi)在方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu),并且向Java程序員提供了訪(fǎng)問(wèn)方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu)的接口。
類(lèi)加載有三種方式:
命令行啟動(dòng)應(yīng)用時(shí)候由JVM初始化加載
通過(guò)Class.forName()方法動(dòng)態(tài)加載
通過(guò)ClassLoader.loadClass()方法動(dòng)態(tài)加載
2.JVM的常見(jiàn)垃圾回收算法?
標(biāo)記-清楚算法:前后線(xiàn)標(biāo)記處所有需要回收的對(duì)象,在標(biāo)記完成后統(tǒng)一回收有被標(biāo)記的對(duì)象。
復(fù)制算法:將可用內(nèi)存按容量劃分為大小相等的兩塊,每次只使用其中的一塊。當(dāng)一塊內(nèi)存用完了,將其存在另外一塊上面,然后再把已使用過(guò)的內(nèi)存空間一次清理掉。
標(biāo)記-整理算法:標(biāo)記過(guò)程與“標(biāo)記-清除”算法一樣,但后續(xù)步驟不是直接對(duì)可回收對(duì)象進(jìn)行清理,而是讓所一端移動(dòng),然后直接清理掉端邊界以外的內(nèi)存。
分代收集算法:一般是把Java堆分為新生代和老年代,根據(jù)各個(gè)年代的特點(diǎn)采用最適當(dāng)?shù)氖占惴?。新生代都發(fā)現(xiàn)有大批對(duì)象死去,選用復(fù)制算法。老年代中因?yàn)閷?duì)象存活率高,必須使用“標(biāo)記-清理”或“標(biāo)記-整理”算法來(lái)進(jìn)行回收。
3.JVM調(diào)優(yōu)的常見(jiàn)命令行工具有哪些?JVM常見(jiàn)的調(diào)優(yōu)參數(shù)有哪些?
(1)JVM調(diào)優(yōu)的常見(jiàn)命令工具包括:
jps命令用于查詢(xún)正在運(yùn)行的JVM進(jìn)程,
jstat可以實(shí)時(shí)顯示本地或遠(yuǎn)程JVM進(jìn)程中類(lèi)裝載、內(nèi)存、垃圾收集、JIT編譯等數(shù)據(jù)
jinfo用于查詢(xún)當(dāng)前運(yùn)行這的JVM屬性和參數(shù)的值。
jmap用于顯示當(dāng)前Java堆和永久代的詳細(xì)信息
jhat用于分析使用jmap生成的dump文件,是JDK自帶的工具
jstack用于生成當(dāng)前JVM的所有線(xiàn)程快照,線(xiàn)程快照是虛擬機(jī)每一條線(xiàn)程正在執(zhí)行的方法,目的是定位線(xiàn)程出現(xiàn)長(zhǎng)時(shí)間停頓的原因。
(2)JVM常見(jiàn)的調(diào)優(yōu)參數(shù)包括:
-Xmx
指定java程序的最大堆內(nèi)存,使用java-Xmx5000M-version判斷當(dāng)前系統(tǒng)能分配的最大堆內(nèi)存
-Xms
指定最小堆內(nèi)存,通常設(shè)置成跟最大堆內(nèi)存一樣,減少GC
-Xmn
設(shè)置年輕代大小。整個(gè)堆大小=年輕代大小+年老代大小。所以增大年輕代后,將會(huì)減小年老代大小。此值對(duì)系統(tǒng)性能影響較大,Sun官方推薦配置為整個(gè)堆的3/8。
-Xss
指定線(xiàn)程的最大??臻g,此參數(shù)決定了java函數(shù)調(diào)用的深度,值越大調(diào)用深度越深,若值太小則容易出棧溢出錯(cuò)誤(StackOverflowError)
-XX:PermSize
指定方法區(qū)(永久區(qū))的初始值,默認(rèn)是物理內(nèi)存的1/64,在Java8永久區(qū)移除,代之的是元數(shù)據(jù)區(qū),由-XX:metaspaceSize指定
-XX:MaxPermSize
指定方法區(qū)的最大值,默認(rèn)是物理內(nèi)存的1/4,在java8中由-XX:MaxmetaspaceSize指定元數(shù)據(jù)區(qū)的大小
-XX:NewRatio=n
年老代與年輕代的比值,-XX:NewRatio=2,表示年老代與年輕代的比值為2:1
-XX:SurvivorRatio=n
Eden區(qū)與Survivor區(qū)的大小比值,-XX:SurvivorRatio=8表示Eden區(qū)與Survivor區(qū)的大小比值是8:1:1,因?yàn)镾urvivor區(qū)有兩個(gè)(from,to)
4.ConcurrentHashMap加鎖機(jī)制是什么,詳細(xì)說(shuō)一下?
HashTable容器在競(jìng)爭(zhēng)激烈的并發(fā)環(huán)境下表現(xiàn)出效率低下的原因,是因?yàn)樗性L(fǎng)問(wèn)HashTable的線(xiàn)程都必須競(jìng)爭(zhēng)同一把鎖,那假如容器里有多把鎖,每一把鎖用于鎖容器其中一部分?jǐn)?shù)據(jù),那么當(dāng)多線(xiàn)程訪(fǎng)問(wèn)容器里不同數(shù)據(jù)段的數(shù)據(jù)時(shí),線(xiàn)程間就不會(huì)存在鎖競(jìng)爭(zhēng),從而可以有效的提高并發(fā)訪(fǎng)問(wèn)效率,這就是ConcurrentHashMap所使用的鎖分段技術(shù),首先將數(shù)據(jù)分成一段一段的存儲(chǔ),然后給每一段數(shù)據(jù)配一把鎖,當(dāng)一個(gè)線(xiàn)程占用鎖訪(fǎng)問(wèn)其中一個(gè)段數(shù)據(jù)的時(shí)候,其他段的數(shù)據(jù)也能被其他線(xiàn)程訪(fǎng)問(wèn)。
精選11道Java技術(shù)面試題并有答案(包含部分阿里和華為的面試題)
5.G1收集器簡(jiǎn)介?以及它的內(nèi)存劃分怎么樣的?
(1)簡(jiǎn)介:
Garbage-First(G1,垃圾優(yōu)先)收集器是服務(wù)類(lèi)型的收集器,目標(biāo)是多處理器機(jī)器、大內(nèi)存機(jī)器。它高度符合垃圾收集暫停時(shí)間的目標(biāo),同時(shí)實(shí)現(xiàn)高吞吐量。OracleJDK7update4以及更新發(fā)布版完全支持G1垃圾收集器
(2)G1的內(nèi)存劃分方式:
它是將堆內(nèi)存被劃分為多個(gè)大小相等的heap區(qū),每個(gè)heap區(qū)都是邏輯上連續(xù)的一段內(nèi)存(virtualmemory).其中一部分區(qū)域被當(dāng)成老一代收集器相同的角色(eden,survivor,old),但每個(gè)角色的區(qū)域個(gè)數(shù)都不是固定的。這在內(nèi)存使用上提供了更多的靈活性
以上就是長(zhǎng)沙一度軟件培訓(xùn)java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“精選華為java面試題,值得收藏”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問(wèn),請(qǐng)?jiān)诰€(xiàn)咨詢(xún),有專(zhuān)業(yè)老師隨時(shí)為你服務(wù)。
Java面試題