精選Java面試題目及最佳答案

精選Java面試題目及最佳答案

長(zhǎng)沙一度軟件培訓(xùn)      2022-04-15 06:42:01     2

精選Java面試題目及最佳答案,  JVM的類加載機(jī)制是什么?有哪些實(shí)現(xiàn)方式?  類加載機(jī)制:  類的加載指的是將類的.class文件中的二進(jìn)制數(shù)據(jù)讀入到內(nèi)存中

課程價(jià)格 請(qǐng)咨詢

上課時(shí)段: 授課校區(qū):

詳細(xì)介紹



  JVM的類加載機(jī)制是什么?有哪些實(shí)現(xiàn)方式?


  類加載機(jī)制:


  類的加載指的是將類的.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)。類的加載最終是在堆區(qū)內(nèi)的Class對(duì)象,Class對(duì)象封裝了類在方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu),并且向Java程序員提供了訪問(wèn)方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu)的接口。


  類加載有三種方式:


  命令行啟動(dòng)應(yīng)用時(shí)候由JVM初始化加載


  通過(guò)Class.forName()方法動(dòng)態(tài)加載


  通過(guò)ClassLoader.loadClass()方法動(dòng)態(tài)加載


  JVM的常見(jiàn)垃圾回收算法?


  標(biāo)記-清楚算法:前后線標(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)行回收。


  JVM調(diào)優(yōu)的常見(jiàn)命令行工具有哪些?JVM常見(jiàn)的調(diào)優(yōu)參數(shù)有哪些?


 ?。?)JVM調(diào)優(yōu)的常見(jiàn)命令工具包括:


  jps命令用于查詢正在運(yùn)行的JVM進(jìn)程,


  jstat可以實(shí)時(shí)顯示本地或遠(yuǎn)程JVM進(jìn)程中類裝載、內(nèi)存、垃圾收集、JIT編譯等數(shù)據(jù)


  jinfo用于查詢當(dāng)前運(yùn)行這的JVM屬性和參數(shù)的值。


  jmap用于顯示當(dāng)前Java堆和永久代的詳細(xì)信息


  jhat用于分析使用jmap生成的dump文件,是JDK自帶的工具


  jstack用于生成當(dāng)前JVM的所有線程快照,線程快照是虛擬機(jī)每一條線程正在執(zhí)行的方法,目的是定位線程出現(xiàn)長(zhǎng)時(shí)間停頓的原因。


 ?。?)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


  指定線程的最大??臻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)


  ConcurrentHashMap加鎖機(jī)制是什么,詳細(xì)說(shuō)一下?


  HashTable容器在競(jìng)爭(zhēng)激烈的并發(fā)環(huán)境下表現(xiàn)出效率低下的原因,是因?yàn)樗性L問(wèn)HashTable的線程都必須競(jìng)爭(zhēng)同一把鎖,那假如容器里有多把鎖,每一把鎖用于鎖容器其中一部分?jǐn)?shù)據(jù),那么當(dāng)多線程訪問(wèn)容器里不同數(shù)據(jù)段的數(shù)據(jù)時(shí),線程間就不會(huì)存在鎖競(jìng)爭(zhēng),從而可以有效的提高并發(fā)訪問(wèn)效率,這就是ConcurrentHashMap所使用的鎖分段技術(shù),首先將數(shù)據(jù)分成一段一段的存儲(chǔ),然后給每一段數(shù)據(jù)配一把鎖,當(dāng)一個(gè)線程占用鎖訪問(wèn)其中一個(gè)段數(shù)據(jù)的時(shí)候,其他段的數(shù)據(jù)也能被其他線程訪問(wèn)。


  G1收集器簡(jiǎn)介?以及它的內(nèi)存劃分怎么樣的?


 ?。?)簡(jiǎn)介:


  Garbage-First(G1,垃圾優(yōu)先)收集器是服務(wù)類型的收集器,目標(biāo)是多處理器機(jī)器、大內(nèi)存機(jī)器。它高度符合垃圾收集暫停時(shí)間的目標(biāo),同時(shí)實(shí)現(xiàn)高吞吐量。OracleJDK7update4以及更新發(fā)布版完全支持G1垃圾收集器


 ?。?)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)存使用上提供了更多的靈活性


  在重寫(xiě)equals方法時(shí),需要遵循哪些約定,具體介紹一下?


  重寫(xiě)equals方法時(shí)需要遵循通用約定:自反性、對(duì)稱性、傳遞性、一致性.、非空性


  1)自反性


  對(duì)于任何非null的引用值x,x.equals(x)必須返回true。---這一點(diǎn)基本上不會(huì)有啥問(wèn)題


  2)對(duì)稱性


  對(duì)于任何非null的引用值x和y,當(dāng)且僅當(dāng)x.equals(y)為true時(shí),y.equals(x)也為true。


  3)傳遞性


  對(duì)于任何非null的引用值x、y、z。如果x.equals(y)==true,y.equals(z)==true,那么x.equals(z)==true。


  4)一致性


  對(duì)于任何非null的引用值x和y,只要equals的比較操作在對(duì)象所用的信息沒(méi)有被修改,那么多次調(diào)用x.eqals(y)就會(huì)一致性地返回true,或者一致性的返回false。


  5)非空性


  所有比較的對(duì)象都不能為空。


  Synchronized優(yōu)化后的鎖機(jī)制簡(jiǎn)單介紹一下,包括自旋鎖、偏向鎖、輕量級(jí)鎖、重量級(jí)鎖?


  自旋鎖:


  線程自旋說(shuō)白了就是讓cup在做無(wú)用功,比如:可以執(zhí)行幾次for循環(huán),可以執(zhí)行幾條空的匯編指令,目的是占著CPU不放,等待獲取鎖的機(jī)會(huì)。如果旋的時(shí)間過(guò)長(zhǎng)會(huì)影響整體性能,時(shí)間過(guò)短又達(dá)不到延遲阻塞的目的。


  偏向鎖:


  偏向鎖就是一旦線程第一次獲得了監(jiān)視對(duì)象,之后讓監(jiān)視對(duì)象“偏向”這個(gè)線程,之后的多次調(diào)用則可以避免CAS操作,


  說(shuō)白了就是置個(gè)變量,如果發(fā)現(xiàn)為true則無(wú)需再走各種加鎖/解鎖流程。


  輕量級(jí)鎖:


  輕量級(jí)鎖是由偏向所升級(jí)來(lái)的,偏向鎖運(yùn)行在一個(gè)線程進(jìn)入同步塊的情況下,當(dāng)?shù)诙€(gè)線程加入鎖爭(zhēng)用的時(shí)候,偏向鎖就會(huì)升級(jí)為輕量級(jí)鎖;


  重量級(jí)鎖:


  重量鎖在JVM中又叫對(duì)象監(jiān)視器(Monitor),它很像C中的Mutex,除了具備Mutex(0|1)互斥的功能,它還負(fù)責(zé)實(shí)現(xiàn)了Semaphore(信號(hào)量)的功能,也就是說(shuō)它至少包含一個(gè)競(jìng)爭(zhēng)鎖的隊(duì)列,和一個(gè)信號(hào)阻塞隊(duì)列(wait隊(duì)列),前者負(fù)責(zé)做互斥,后一個(gè)用于做線程同步。


  偏向鎖、輕量級(jí)鎖、重量級(jí)鎖的對(duì)比:



  以上就是長(zhǎng)沙一度軟件培訓(xùn)Java培訓(xùn)機(jī)構(gòu)小編介紹的“精選Java面試題目及最佳答案!”的內(nèi)容,希望對(duì)大家有幫助,如有疑問(wèn),請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。


相關(guān)推薦


最新最全java面試題及答案(初級(jí)到高級(jí))


史上最全的中高級(jí)JAVA工程師面試題及答案匯總


Java高級(jí)開(kāi)發(fā)工程師面試題


2019史上最全java面試題題庫(kù)大全800題


哪有資深java工程師面試題


Java面試題

培訓(xùn)啦提醒您:交易時(shí)請(qǐng)核實(shí)對(duì)方資質(zhì),對(duì)于過(guò)大宣傳或承諾需謹(jǐn)慎!任何要求預(yù)付定金、匯款等方式均存在風(fēng)險(xiǎn),謹(jǐn)防上當(dāng)。