精選11道Java技術(shù)面試題及對(duì)應(yīng)答案【包含部分阿里和華為的面試題】

1. 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)的接口。
類加載有三種方式:
1)命令行啟動(dòng)應(yīng)用時(shí)候由JVM初始化加載
2)通過(guò)Class.forName()
方法動(dòng)態(tài)加載
3)通過(guò)ClassLoader.loadClass()
方法動(dòng)態(tài)加載
2. JVM的常見(jiàn)垃圾回收算法?
1)標(biāo)記-清楚算法:前后線標(biāo)記處所有需要回收的對(duì)象,在標(biāo)記完成后統(tǒng)一回收有被標(biāo)記的對(duì)象。
2)復(fù)制算法:將可用內(nèi)存按容量劃分為大小相等的兩塊,每次只使用其中的一塊。當(dāng)一塊內(nèi)存用完了,將其存在另外一塊上面,然后再把已使用過(guò)的內(nèi)存空間一次清理掉。
3)標(biāo)記-整理算法:標(biāo)記過(guò)程與“標(biāo)記-清除”算法一樣,但后續(xù)步驟不是直接對(duì)可回收對(duì)象進(jìn)行清理,而是讓所一端移動(dòng),然后直接清理掉端邊界以外的內(nèi)存。
4)分代收集算法:一般是把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)命令工具包括:
1)jps命令用于查詢正在運(yùn)行的JVM進(jìn)程,
2)jstat可以實(shí)時(shí)顯示本地或遠(yuǎn)程JVM進(jìn)程中類裝載、內(nèi)存、垃圾收集、JIT編譯等數(shù)據(jù)
3)jinfo用于查詢當(dāng)前運(yùn)行這的JVM屬性和參數(shù)的值。
4)jmap用于顯示當(dāng)前Java堆和永久代的詳細(xì)信息
5)jhat用于分析使用jmap生成的dump文件,是JDK自帶的工具
6)jstack用于生成當(dāng)前JVM的所有線程快照,線程快照是虛擬機(jī)每一條線程正在執(zhí)行的方法,目的是定位線程出現(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
指定線程的最大棧空間, 此參數(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問(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)。
5. G1收集器簡(jiǎn)介?以及它的內(nèi)存劃分怎么樣的?
(1)簡(jiǎn)介:
Garbage-First(G1,垃圾優(yōu)先)收集器是服務(wù)類型的收集器,目標(biāo)是多處理器機(jī)器、大內(nèi)存機(jī)器。它高度符合垃圾收集暫停時(shí)間的目標(biāo),同時(shí)實(shí)現(xiàn)高吞吐量。Oracle JDK 7 update 4 以及更新發(fā)布版完全支持G1垃圾收集器
(2)G1的內(nèi)存劃分方式:
它是將堆內(nèi)存被劃分為多個(gè)大小相等的 heap 區(qū),每個(gè)heap區(qū)都是邏輯上連續(xù)的一段內(nèi)存(virtual memory). 其中一部分區(qū)域被當(dāng)成老一代收集器相同的角色(eden, survivor, old), 但每個(gè)角色的區(qū)域個(gè)數(shù)都不是固定的。這在內(nèi)存使用上提供了更多的靈活性
6. 在重寫(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ì)象都不能為空。
7. 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ì)比:
8. Redis和Memcache區(qū)別對(duì)比?如何選擇這兩個(gè)技術(shù)?
區(qū)別:
1) Redis和Memcache都是將數(shù)據(jù)存放在內(nèi)存中,都是內(nèi)存數(shù)據(jù)庫(kù)。不過(guò)memcache還可用于緩存其他東西,例如圖片、視頻等等。
2)Redis不僅僅支持簡(jiǎn)單的k/v類型的數(shù)據(jù),同時(shí)還提供list,set,hash等數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)。
3)虛擬內(nèi)存--Redis當(dāng)物理內(nèi)存用完時(shí),可以將一些很久沒(méi)用到的value 交換到磁盤(pán)
4)過(guò)期策略--memcache在set時(shí)就指定,例如set key1 0 0 8,即永不過(guò)期。Redis可以通過(guò)例如expire 設(shè)定,例如expire name 10
5)分布式--設(shè)定memcache集群,利用magent做一主多從;redis可以做一主多從。都可以一主一從
6)存儲(chǔ)數(shù)據(jù)安全--memcache掛掉后,數(shù)據(jù)沒(méi)了;redis可以定期保存到磁盤(pán)(持久化)
7)災(zāi)難恢復(fù)--memcache掛掉后,數(shù)據(jù)不可恢復(fù); redis數(shù)據(jù)丟失后可以通過(guò)aof恢復(fù)
8)Redis支持?jǐn)?shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份。
選型:
若是簡(jiǎn)單的存取key-value這樣的數(shù)據(jù)用memcache好一些
若是要支持?jǐn)?shù)據(jù)持久化,多數(shù)據(jù)類型(如集合、散列之類的),用列表類型做隊(duì)列之類的高級(jí)應(yīng)用,就用redis
9. Redis的持久化機(jī)制是什么?各自的優(yōu)缺點(diǎn)?
redis提供兩種持久化機(jī)制RDB和AOF機(jī)制。
1)RDB持久化方式:
是指用數(shù)據(jù)集快照的方式記錄redis數(shù)據(jù)庫(kù)的所有鍵值對(duì)。
優(yōu)點(diǎn):
1.只有一個(gè)文件dump.rdb,方便持久化。
2.容災(zāi)性好,一個(gè)文件可以保存到安全的磁盤(pán)。
3.性能最大化,fork子進(jìn)程來(lái)完成寫(xiě)操作,讓主進(jìn)程繼續(xù)處理命令,所以是IO最大化。
4.相對(duì)于數(shù)據(jù)集大時(shí),比AOF的啟動(dòng)效率更高。
缺點(diǎn):
1.數(shù)據(jù)安全性低。
2)AOF持久化方式:
是指所有的命令行記錄以redis命令請(qǐng)求協(xié)議的格式保存為aof文件。
優(yōu)點(diǎn):
1.數(shù)據(jù)安全,aof持久化可以配置appendfsync屬性,有always,每進(jìn)行一次命令操作就記錄到aof文件中一次。
2.通過(guò)append模式寫(xiě)文件,即使中途服務(wù)器宕機(jī),可以通過(guò)redis-check-aof工具解決數(shù)據(jù)一致性問(wèn)題。
3.AOF機(jī)制的rewrite模式。
缺點(diǎn):
1.文件會(huì)比RDB形式的文件大。
2.數(shù)據(jù)集大的時(shí)候,比rdb啟動(dòng)效率低。
10. Mysql的數(shù)據(jù)庫(kù)表鎖、行鎖、頁(yè)級(jí)鎖?
表級(jí),直接鎖定整張表,在你鎖定期間,其它進(jìn)程無(wú)法對(duì)該表進(jìn)行寫(xiě)操作。如果你是寫(xiě)鎖,則其它進(jìn)程則讀也不允許
行級(jí),,僅對(duì)指定的記錄進(jìn)行加鎖,這樣其它進(jìn)程還是可以對(duì)同一個(gè)表中的其它記錄進(jìn)行操作。
頁(yè)級(jí),表級(jí)鎖速度快,但沖突多,行級(jí)沖突少,但速度慢。所以取了折衷的頁(yè)級(jí),一次鎖定相鄰的一組記錄。
11. 數(shù)據(jù)庫(kù)的四大特征,數(shù)據(jù)庫(kù)的隔離級(jí)別?
數(shù)據(jù)庫(kù)的四大特征:
(1)原子性(Atomicity)
原子性是指事務(wù)包含的所有操作要么全部成功,要么全部失敗回滾。
(2)一致性(Consistency)
一個(gè)事務(wù)執(zhí)行之前和執(zhí)行之后都必須處于一致性狀態(tài)。
(3)隔離性(Isolation)
隔離性是當(dāng)多個(gè)用戶并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)時(shí),比如操作同一張表時(shí),數(shù)據(jù)庫(kù)為每一個(gè)用戶開(kāi)啟的事務(wù),不能被其他事務(wù)的操作所干擾,多個(gè)并發(fā)事務(wù)之間要相互隔離。
4)持久性(Durability)
持久性是指一個(gè)事務(wù)一旦被提交了,那么對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)的改變就是永久性的。
數(shù)據(jù)庫(kù)的隔離級(jí)別:
1)Serializable (串行化):可避免臟讀、不可重復(fù)讀、幻讀的發(fā)生。
2)Repeatable read (可重復(fù)讀):可避免臟讀、不可重復(fù)讀的發(fā)生。
3)Read committed (讀已提交):可避免臟讀的發(fā)生。
4)Read uncommitted (讀未提交):最低級(jí)別,任何情況都無(wú)法保證。
相關(guān)文章
9月最新184道阿里、百度、騰訊、頭條Java面試題合集(小結(jié))
這篇文章主要介紹了9月最新184道阿里、百度、騰訊、頭條Java面試題合集,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-09-09- 這篇文章主要介紹了兩道阿里python面試題與參考答案,結(jié)合具體實(shí)例形式分析了Python數(shù)組創(chuàng)建、遍歷、拆分及隨機(jī)數(shù)等相關(guān)操作技巧,需要的朋友可以參考下2019-09-02
2019 金三銀四:阿里P9架構(gòu)的Android大廠面試題總結(jié)
面試是一道坎,很多人會(huì)恐懼面試,即使是工作很多年的老鳥(niǎo),可能仍存在面試的焦慮。 今天介紹了阿里P9架構(gòu)的Android大廠面試題總結(jié)的相關(guān)資料,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分2019-05-052019年成功入職阿里:阿里的三套Java研發(fā)崗面試題總結(jié)
之前過(guò)了幾個(gè)簡(jiǎn)單的簡(jiǎn)歷面,所以總結(jié)了幾套面試的試題供大家分享。小編覺(jué)得挺不錯(cuò)的,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-04-25- 這是一道真真實(shí)實(shí)的阿里面試題:“請(qǐng)解釋下為什么鹿晗發(fā)布戀情的時(shí)候, 微博系統(tǒng)會(huì)崩潰,如何解決2019-09-16