精選11道Java技術面試題並有答案(包含部分阿里和華爲的面試題)

1. JVM的類加載機制是什麼?有哪些實現方式?

類加載機制:java

類的加載指的是將類的.class文件中的二進制數據讀入到內存中,將其放在運行時數據區的方法去內,而後在堆區建立一個java.lang.Class對象,用來封裝在方法區內的數據結構。類的加載最終是在堆區內的Class對象,Class對象封裝了類在方法區內的數據結構,而且向Java程序員提供了訪問方法區內的數據結構的接口。程序員

類加載有三種方式:面試

1)命令行啓動應用時候由JVM初始化加載redis

2)經過Class.forName()方法動態加載算法

3)經過ClassLoader.loadClass()方法動態加載sql

2. JVM的常見垃圾回收算法?

1)標記-清楚算法:先後線標記處全部須要回收的對象,在標記完成後統一回收有被標記的對象。數據庫

2)複製算法:將可用內存按容量劃分爲大小相等的兩塊,每次只使用其中的一塊。當一塊內存用完了,將其存在另一塊上面,而後再把已使用過的內存空間一次清理掉。緩存

3)標記-整理算法:標記過程與「標記-清除」算法同樣,但後續步驟不是直接對可回收對象進行清理,而是讓所一端移動,而後直接清理掉端邊界之外的內存。安全

4)分代收集算法:通常是把Java堆分爲新生代和老年代,根據各個年代的特色採用最適當的收集算法。新生代都發現有大批對象死去,選用複製算法。老年代中由於對象存活率高,必須使用「標記-清理」或「標記-整理」算法來進行回收。服務器

3. JVM調優的常見命令行工具備哪些?JVM常見的調優參數有哪些?

(1)JVM調優的常見命令工具包括:

1)jps命令用於查詢正在運行的JVM進程,

2)jstat能夠實時顯示本地或遠程JVM進程中類裝載、內存、垃圾收集、JIT編譯等數據

3)jinfo用於查詢當前運行這的JVM屬性和參數的值。

4)jmap用於顯示當前Java堆和永久代的詳細信息

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

6)jstack用於生成當前JVM的全部線程快照,線程快照是虛擬機每一條線程正在執行的方法,目的是定位線程出現長時間停頓的緣由。

(2)JVM常見的調優參數包括:

-Xmx

  指定java程序的最大堆內存, 使用java -Xmx5000M -version判斷當前系統能分配的最大堆內存

-Xms

  指定最小堆內存, 一般設置成跟最大堆內存同樣,減小GC

-Xmn

  設置年輕代大小。整個堆大小=年輕代大小 + 年老代大小。因此增大年輕代後,將會減少年老代大小。此值對系統性能影響較大,Sun官方推薦配置爲整個堆的3/8。

-Xss

  指定線程的最大棧空間, 此參數決定了java函數調用的深度, 值越大調用深度越深, 若值過小則容易出棧溢出錯誤(StackOverflowError)

-XX:PermSize

  指定方法區(永久區)的初始值,默認是物理內存的1/64, 在Java8永久區移除, 代之的是元數據區, 由-XX:MetaspaceSize指定

-XX:MaxPermSize

  指定方法區的最大值, 默認是物理內存的1/4, 在java8中由-XX:MaxMetaspaceSize指定元數據區的大小

-XX:NewRatio=n

  年老代與年輕代的比值,-XX:NewRatio=2, 表示年老代與年輕代的比值爲2:1

-XX:SurvivorRatio=n

  Eden區與Survivor區的大小比值,-XX:SurvivorRatio=8表示Eden區與Survivor區的大小比值是8:1:1,由於Survivor區有兩個(from, to)

4. ConcurrentHashMap加鎖機制是什麼,詳細說一下?

HashTable容器在競爭激烈的併發環境下表現出效率低下的緣由,是由於全部訪問HashTable的線程都必須競爭同一把鎖,那假如容器裏有多把鎖,每一把鎖用於鎖容器其中一部分數據,那麼當多線程訪問容器裏不一樣數據段的數據時,線程間就不會存在鎖競爭,從而能夠有效的提升併發訪問效率,這就是ConcurrentHashMap所使用的鎖分段技術,首先將數據分紅一段一段的存儲,而後給每一段數據配一把鎖,當一個線程佔用鎖訪問其中一個段數據的時候,其餘段的數據也能被其餘線程訪問。

5. G1收集器簡介?以及它的內存劃分怎麼樣的?

(1)簡介:

Garbage-First(G1,垃圾優先)收集器是服務類型的收集器,目標是多處理器機器、大內存機器。它高度符合垃圾收集暫停時間的目標,同時實現高吞吐量。Oracle JDK 7 update 4 以及更新發布版徹底支持G1垃圾收集器

(2)G1的內存劃分方式:

它是將堆內存被劃分爲多個大小相等的 heap 區,每一個heap區都是邏輯上連續的一段內存(virtual memory). 其中一部分區域被當成老一代收集器相同的角色(eden, survivor, old), 但每一個角色的區域個數都不是固定的。這在內存使用上提供了更多的靈活性

##

6. 在重寫equals方法時,須要遵循哪些約定,具體介紹一下?

重寫equals方法時須要遵循通用約定:自反性、對稱性、傳遞性、一致性.、非空性

1)自反性

對於任何非null的引用值x,x.equals(x)必須返回true。---這一點基本上不會有啥問題

2)對稱性

對於任何非null的引用值x和y,當且僅當x.equals(y)爲true時,y.equals(x)也爲true。

3)傳遞性

對於任何非null的引用值x、y、z。若是x.equals(y)==true,y.equals(z)==true,那麼x.equals(z)==true。

4) 一致性

對於任何非null的引用值x和y,只要equals的比較操做在對象所用的信息沒有被修改,那麼屢次調用x.eqals(y)就會一致性地返回true,或者一致性的返回false。

5)非空性

全部比較的對象都不能爲空。

7. Synchronized優化後的鎖機制簡單介紹一下,包括自旋鎖、偏向鎖、輕量級鎖、重量級鎖?

自旋鎖:

線程自旋說白了就是讓cup在作無用功,好比:能夠執行幾回for循環,能夠執行幾條空的彙編指令,目的是佔着CPU不放,等待獲取鎖的機會。若是旋的時間過長會影響總體性能,時間太短又達不到延遲阻塞的目的。

偏向鎖

偏向鎖就是一旦線程第一次得到了監視對象,以後讓監視對象「偏向」這個線程,以後的屢次調用則能夠避免CAS操做,

說白了就是置個變量,若是發現爲true則無需再走各類加鎖/解鎖流程。

輕量級鎖:

輕量級鎖是由偏向所升級來的,偏向鎖運行在一個線程進入同步塊的狀況下,當第二個線程加入鎖爭用的時候,偏向鎖就會升級爲輕量級鎖;

重量級鎖

重量鎖在JVM中又叫對象監視器(Monitor),它很像C中的Mutex,除了具有Mutex(0|1)互斥的功能,它還負責實現了Semaphore(信號量)的功能,也就是說它至少包含一個競爭鎖的隊列,和一個信號阻塞隊列(wait隊列),前者負責作互斥,後一個用於作線程同步。

偏向鎖、輕量級鎖、重量級鎖的對比:

8. Redis和Memcache區別對比?如何選擇這兩個技術?

區別:

1) Redis和Memcache都是將數據存放在內存中,都是內存數據庫。不過memcache還可用於緩存其餘東西,例如圖片、視頻等等。

2)Redis不只僅支持簡單的k/v類型的數據,同時還提供list,set,hash等數據結構的存儲。

3)虛擬內存--Redis當物理內存用完時,能夠將一些好久沒用到的value 交換到磁盤

4)過時策略--memcache在set時就指定,例如set key1 0 0 8,即永不過時。Redis能夠經過例如expire 設定,例如expire name 10

5)分佈式--設定memcache集羣,利用magent作一主多從;redis能夠作一主多從。均可以一主一從

6)存儲數據安全--memcache掛掉後,數據沒了;redis能夠按期保存到磁盤(持久化)

7)災難恢復--memcache掛掉後,數據不可恢復; redis數據丟失後能夠經過aof恢復

8)Redis支持數據的備份,即master-slave模式的數據備份。

選型:

如果簡單的存取key-value這樣的數據用memcache好一些

如果要支持數據持久化,多數據類型(如集合、散列之類的),用列表類型作隊列之類的高級應用,就用redis

9. Redis的持久化機制是什麼?各自的優缺點?

redis提供兩種持久化機制RDB和AOF機制。

1)RDB持久化方式:

是指用數據集快照的方式記錄redis數據庫的全部鍵值對。

優勢:

  1.只有一個文件dump.rdb,方便持久化。

  2.容災性好,一個文件能夠保存到安全的磁盤。

  3.性能最大化,fork子進程來完成寫操做,讓主進程繼續處理命令,因此是IO最大化。

  4.相對於數據集大時,比AOF的啓動效率更高。

缺點:

  1.數據安全性低。

2)AOF持久化方式:

是指全部的命令行記錄以redis命令請求協議的格式保存爲aof文件。

優勢:

  1.數據安全,aof持久化能夠配置appendfsync屬性,有always,每進行一次命令操做就記錄到aof文件中一次。

  2.經過append模式寫文件,即便中途服務器宕機,能夠經過redis-check-aof工具解決數據一致性問題。

  3.AOF機制的rewrite模式。

缺點:

  1.文件會比RDB形式的文件大。

  2.數據集大的時候,比rdb啓動效率低。

10. Mysql的數據庫表鎖、行鎖、頁級鎖?

表級,直接鎖定整張表,在你鎖按期間,其它進程沒法對該表進行寫操做。若是你是寫鎖,則其它進程則讀也不容許

行級,,僅對指定的記錄進行加鎖,這樣其它進程仍是能夠對同一個表中的其它記錄進行操做。

頁級,表級鎖速度快,但衝突多,行級衝突少,但速度慢。因此取了折衷的頁級,一次鎖定相鄰的一組記錄。

11. 數據庫的四大特徵,數據庫的隔離級別?

數據庫的四大特徵:

(1)原子性(Atomicity)

原子性是指事務包含的全部操做要麼所有成功,要麼所有失敗回滾。

(2)一致性(Consistency)

一個事務執行以前和執行以後都必須處於一致性狀態。

(3)隔離性(Isolation)

隔離性是當多個用戶併發訪問數據庫時,好比操做同一張表時,數據庫爲每個用戶開啓的事務,不能被其餘事務的操做所幹擾,多個併發事務之間要相互隔離。

4)持久性(Durability)

持久性是指一個事務一旦被提交了,那麼對數據庫中的數據的改變就是永久性的。

 數據庫的隔離級別:

1)Serializable (串行化):可避免髒讀、不可重複讀、幻讀的發生。2)Repeatable read (可重複讀):可避免髒讀、不可重複讀的發生。3)Read committed (讀已提交):可避免髒讀的發生。4)Read uncommitted (讀未提交):最低級別,任何狀況都沒法保證。

微信掃描,搜索公衆號:JAVA高級架構 裏面有阿里,百度面試問題。 分享開源,學習架構,一塊兒學習進步。還有高級架構資料分享噢! 想學習獲取Java工程化、高性能及分佈式、高性能、性能調優、Spring,MyBatis,Netty源碼分析學習的能夠掃描加入。
相關文章
相關標籤/搜索