阿里Java研發面經問題以及解答20200415

簡單介紹一下Hadoop生態圈

使用過Flink嘛?它和Spark的區別是什麼   爲啥選擇學Spark呢?

HDFS是如何進行工作的(回答了讀寫數據的流程)

Hadoop2.0的高可用簡單介紹一下,爲什麼要使用ZooKeeper

Hadoop和Spark的區別,分別在哪些地方使用

 說一下Kafka的特點(從分區,副本,Consumer Group等方面說了一下)

 Kafka分區機制有什麼優勢

瞭解Kafka的零拷貝嗎?(這個當時沒答上來)

Redis的IO模型瞭解嗎

     多路複用,就讓我繼續展開講講IO多路複用的實現NIO

爲什麼要使用Hbase(項目中有提,從隨機存儲,易擴展,hdfs等方面回答的)

說一下你理解的封裝,繼承和多態

將對象的屬性和方法相結合,通過方法將對象的屬性和實現細節保護起來,實現對象的屬性隱藏。

繼承是類與類的一種關係,子類擁有父類的所有屬性和方法(除了private修飾的屬性不能擁有)從而實現了實現代碼的複用。

引用多態是指:父類引用可以指向本類對象,也可指向子類對象。引用多態的強大主要體現在調用屬性、方法時,可以根據引用具體指向的對象去調用,例如:子類中重寫了父類方法。

使用過Java集合嗎,介紹一下集合

list set map等集合的與原理和比較關係

 說一下LinkedList和ArrayList插入的複雜度

一個是基於鏈表的實現 一個是hi基於數組的實現 一個複雜爲O(n) 一個是O(1)

剛纔你說ConcurrentHashMap是線程安全的,如何保證的

JD1.7中採用的是分段鎖+Entry實現 JDK1.8通過使用的鎖住鏈表節點

瞭解異常體系嗎,介紹一下異常體系

編譯時異常 邏輯異常 運行時異常

 異常捕獲時,是先捕獲小異常還是大異常(不確定,回答了小異常)

 

 有用過線程池麼,介紹一下有哪幾種線程池

線程池的初始化

線程池的任務處理

線程池的緩存隊列

線城池的拒絕策略

線程池的關閉

使用過ThreadLocal嗎,介紹一下  線程池中使用ThreadLocal會有什麼問題

它是一種爲共享變量在每一個線程中創建一個副本,每一個線程都是可以訪問自己的副本的變量。通過綁定線程來實現對線程副本的操作。而不影響其他線程。目的就是爲了解決在多線程下訪問一個變量的下數據的一致性。

ThreadLocal造成內存泄漏的原因?

ThreadLocalMap 中使用的 key 爲 ThreadLocal 的弱引用,而 value 是強引用。所以,如果 ThreadLocal 沒有被外部強引用的情況下,在垃圾回收的時候,key會被清理掉,而value 不會被清理掉。這樣一來,ThreadLocalMap 中就會出現key爲null的Entry。假如我們不做任何措施的話,value 永遠無法被GC 回收,這個時候就可能會產生內存泄露。ThreadLocalMap實現中已經考慮了這種情況,在調用 set()、get()、remove() 方法的時候,會清理掉 key 爲 null 的記錄。使用完 ThreadLocal方法後 最好手動調用remove()方法

ThreadLocal內存泄漏解決方案?

每次使用完ThreadLocal,都調用它的remove()方法,清除數據。

在使用線程池的情況下,沒有及時清理ThreadLocal,不僅是內存泄漏的問題,更嚴重的是可能導致業務邏輯出現問題。所以,使用ThreadLocal就跟加鎖完要解鎖一樣,用完就清理。

 

說一下樂觀鎖和悲觀鎖

悲觀鎖:總是假設最壞的情況,每次去拿數據的時候都認爲別人會修改,所以每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會阻塞直到它拿到鎖。傳統的關係型數據庫裏邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。再比如 Java 裏面的同步原語 synchronized 關鍵字的實現也是悲觀鎖。

樂觀鎖:顧名思義,就是很樂觀,每次去拿數據的時候都認爲別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可以使用版本號等機制。樂觀鎖適用於多讀的應用類型,這樣可以提高吞吐量,像數據庫提供的類似於 write_condition 機制,其實都是提供的樂觀鎖。在 Java中 java.util.concurrent.atomic 包下面的原子變量類就是使用了樂觀鎖的一種實現方式 CAS 實現的。

樂觀鎖的實現方式:

1、使用版本標識來確定讀到的數據與提交時的數據是否一致。提交後修改版本標識,不一致時可以採取丟棄和再次嘗試的策略。

2、java 中的 Compare and Swap 即 CAS ,當多個線程嘗試使用 CAS 同時更新同一個變量時,只有其中一個線程能更新變量的值,而其它線程都失敗,失敗的線程並不會被掛起,而是被告知這次競爭中失敗,並可以再次嘗試。 CAS 操作中包含三個操作數 —— 需要讀寫的內存位置(V)、進行比較的預期原值(A)和擬寫入的新值(B)。如果內存位置 V 的值與預期原值 A 相匹配,那麼處理器會自動將該位置值更新爲新值 B。否則處理器不做任何操作。

介紹一下各種排序算法的時間複雜度

8中排序實現和實踐複雜度

講一下Mysql的四個隔離級別

讀未提交 讀已提交 可重複讀 串行化

是否有數據庫調優的經驗,主要在哪些方面(慢查詢,索引失效等等)

字段優化

索引優化

查詢優化

讀寫分離

分庫分表

集羣優化

增加硬件

線程的六大狀態

創建 -就緒-運行 結束 阻塞

程序出現死鎖時,CPU和內存的變化

Linux下如何看CPU的運行狀態,如何看具體進程線程的情況

看到你項目用過Redis,講一下穿透,擊穿雪崩這些和解決方法

緩存雪崩是指緩存同一時間大面積的失效,所以,後面的請求都會落到數據庫上,造成數據庫短時間內承受大量請求而崩掉。

解決方案

    緩存數據的過期時間設置隨機,防止同一時間大量數據過期現象發生。

    一般併發量不是特別多的時候,使用最多的解決方案是加鎖排隊。

    給每一個緩存數據增加相應的緩存標記,記錄緩存的是否失效,如果緩存標記失效,則更新數據緩存。

緩存穿透是指緩存和數據庫中都沒有的數據,導致所有的請求都落到數據庫上,造成數據庫短時間內承受大量請求而崩掉。

解決方案

    接口層增加校驗,如用戶鑑權校驗,id做基礎校驗,id<=0的直接攔截;

    從緩存取不到的數據,在數據庫中也沒有取到,這時也可以將key-value對寫爲key-null,緩存有效時間可以設置短點,如30秒(設置太長會導致正常情況也沒法使用)。這樣可以防止攻擊用戶反覆用同一個id暴力攻擊

採用布隆過濾器,將所有可能存在的數據哈希到一個足夠大的 bitmap 中,一個一定不存在的數據會被這個 bitmap 攔截掉,從而避免了對底層存儲系統的查詢壓力

緩存擊穿是指緩存中沒有但數據庫中有的數據(一般是緩存時間到期),這時由於併發用戶特別多,同時讀緩存沒讀到數據,又同時去數據庫去取數據,引起數據庫壓力瞬間增大,造成過大壓力。和緩存雪崩不同的是,緩存擊穿指併發查同一條數據,緩存雪崩是不同數據都過期了,很多數據都查不到從而查數據庫。

解決方案

    設置熱點數據永遠不過期。

    加互斥鎖,互斥鎖

Java 講一下volatile關鍵字吧,在什麼地方用到過,能舉個例子嘛

一致可見性 JMM內從模型 緩存一致性協議

程序出現死鎖如何進行定位,如何解決

一個程序,while(true){new Thread().start()}運行會發生什麼

用過什麼線程池,使用Fixed的線程池時如果一個線程出現異常,那麼核心線程會發生什麼變化

 

Synchronize和ReentrantLock有什麼不同

synchronized屬於重量級鎖,效率低下,因爲監視器鎖(monitor)是依賴於底層的操作系統的 Mutex Lock 來實現的,Java 的線程是映射到操作系統的原生線程之上的。如果要掛起或者喚醒一個線程,都需要操作系統幫忙完成,而操作系統實現線程之間的切換時需要從用戶態轉換到內核態,在 Java 6 之後 Java 官方對從 JVM 層面對synchronized 較大優化,JDK1.6對鎖的實現引入了大量的優化,如自旋鎖、適應性自旋鎖、鎖消除、鎖粗化、偏向鎖、輕量級鎖等技術來減少鎖操作的開銷。

Reentlock是輕量級鎖 通過標誌位來實現獲取鎖。

網絡七層模型介紹一下,HTTP和TCP分別位於哪一層

 

 TCP和UDP的區別

 Spring Bean的生命週期

 

Spring中Bean創建中可能出現的衝突問題Spring是如何解決的

 

 詳述一下你知道的幾個數據庫引擎,比較一下他們的差別

InnoDb Myisam比較的

簡述一下MapReduce的工作流程,如何和HDFS一同工作等

說一下一致性哈希算法

說一下Redis的分佈式鎖,使用過哪些方式上鎖

還用過其他分佈式緩存嗎(答MemCache,讓我比較兩者的區別)

介紹一下你瞭解的機器學習算法

簡單說一下CNN

操作系統的內核態和用戶態說一下區別

進程和線程的通信有什麼區別

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章