1. 程式人生 > >Java面試常見知識點彙總

Java面試常見知識點彙總

什麼是JMM,談談你對JMM的理解?

JMM(Java 記憶體模型),

Java執行緒之間的通訊採用的是過共享記憶體模型,這裡提到的共享記憶體模型指的就是Java記憶體模型(簡稱JMM),JMM決定一個執行緒對共享變數的寫入何時對另一個執行緒可見。從抽象的角度來看,JMM定義了執行緒和主記憶體之間的抽象關係:執行緒之間的共享變數儲存在主記憶體(main memory)中,每個執行緒都有一個私有的本地記憶體(local memory),本地記憶體中儲存了該執行緒以讀/寫共享變數的副本。

需要注意的是,JMM與Java記憶體區域的劃分是不同的概念層次,更恰當說JMM描述的是一組規則,通過這組規則控制程式中各個變數在共享資料區域和私有資料區域的訪問方式,JMM是圍繞原子性,有序性、可見性展開的(稍後會分析);

參考這裡

Java 記憶體模型的主要目標是定義程式中各個變數的訪問規則,即在虛擬機器中將變數存
儲到記憶體和從記憶體中取出變數這樣底層細節。此處的變數與 Java 程式設計時所說的變數不一樣,指包括了例項欄位、靜態欄位和構成陣列物件的元素,但是不包括區域性變數與方法引數,後者是執行緒私有的,不會被共享。

談談你對GC的理解?

這篇博文總結的非常到位!
結合GC三要素:
1. 什麼記憶體需要GC?
2. 什麼時候進行GC?
3. 怎麼進行GC回收?

談談你對spring的AOP的理解?

它利用一種稱為”橫切”的技術,剖解開封裝的物件內部,並將那些影響了多個類的公共行為封裝到一個可重用模組,並將其命名為”Aspect”,即切面。所謂”切面”, 簡單說就是那些與業務無關,卻為業務模組所共同呼叫的邏輯或責任封裝起來,便於減少系統的重複程式碼,降低模組之間的耦合度,並有利於未來的可操作性和可維護性。

TCP連線為什麼是3次握手,4次揮手?

  • 因為在連線過程中,客戶端向server端傳送SYC同步請求時,server直接可以回覆SYC(用來同步)和ACK(用來應答)給客戶端,這樣客戶端再回復ACK給server端後就可以傳輸資料了。
  • 而在斷開連線過程中,客戶端向server端傳送FIN後,server並不會馬上關閉socket,因為可能還有資料在傳輸,只會回覆ACK提醒客戶端你的FIN請求我收到了,之後等它的資料都傳完了,才會傳送FIN報文告訴客戶端我傳完了,然後客戶端繼續傳送ACK作為應答,這才可以算是結束了揮手過程。

對於MySQL慢查詢你有什麼優化策略?

為什麼選用springboot作為開發框架?

核心還是spring,不過是對外做了大量封裝,大大提高了開發的效率;不必再像傳統spring開發過程中,需要面臨大量的整合三方應用包括伺服器等的麻煩,配置起來非常方便;方便了部署,配置,監控;缺點是封裝了太多的東西,更加難以接觸到spring的本質,就像是棉花糖,使用方便,但是想做自己單獨的配置,需要去讀很多官方文件,修改不少指定的類,而且版本不斷的更新,有不少坑得踩;

談談SpringMVC的原理

首先MVC是一種設計模式,model是模型,如services層和dao層處理業務的,view是檢視,如前端的html和jsp顯示層,controller是控制器,是控制使用者訪問的控制層,如執行攔截,驗證,根據特定的url找到對應的模型進行處理等;之前網路上有struts,struts2等MVC框架出現過,而SpringMVC就是基於spring這一個非常流行框架下的MVC框架,因為Spring框架的IOC和AOP等特性,springmvc也流行起來,主要能將業務處理很好的和使用者訪問控制解耦,天然集成於spring中;

和struts區別:springmvc是基於方法開發,一個url對應一個方法,引數作為方法形參傳入,而struts2是基於類,請求引數是通過類的屬性傳入;

如何工作的?

為什麼選用RabbitMQ作為訊息中介軟體

傳統的AMQP實現的訊息佇列,對資料的一致性,可靠性,穩定性要求較高,但是對效能和吞吐量還在其次;而kafka一開始開發出來就是為了處理海量資料如日誌處理和傳輸,追求高吞吐量,不支援事務。

談談你對Redis的理解?

Redis不僅可以做快取,還可以做DB,分散式鎖,訊息佇列等;使用Redis作為快取層,主要是基於Redis的效能和併發:redis是單執行緒的,redis的純記憶體操作;採用了非阻塞的I/O多路複用機制;

快取穿透:訪問的資料都不在快取裡導致大量訪問資料庫,從而使資料庫連線異常;

快取雪崩:快取同一時間的大量失效,又來一波請求,結果導致資料庫連線異常;

Redis裡使用過哪些常見的資料型別,有序的集合使用過麼?底層是怎麼實現的?

死鎖的生成條件

死鎖的條件:互斥、持有並等待、資源不可被剝奪、迴圈等待