浩鯨科技高級工程師面試總結

一面:技術面

1.自我介紹

你好,面試官,我是XXX,於xxxx參加工作,上家公司就職於xxxx,做過xxxx項目,會xxx技術,最擅長xxx,平時生活愛好。。。

2.Spring AOP的原理和用處

原理:

SpringAOP是動態代理來實現,有兩種代理方式:JDK動態代理與CGLIB動態代理。

JDK動態代理:是通過反射來接收被代理類,要求必須實現一個接口。

CGLIB動態代理:當被代理類沒有實現一個接口的時候,就會使用CGLIB進行動態代理。CGLIB動態代理通過運行時動態生成被代理類的子類,運用繼承的方式來實現動態代理。如果被代理類被final修飾了,那麼就不能使用CGLIB進行動態代理了

用途:

SpringAOP切面編程,在日常開發中,主要用於框架接口訪問的攔截控制,網關層的訪問過濾,日誌記錄等

3.NIO的實現方式,用途

實現方式:

NIO,非阻塞IO,也稱New IO,是一種同步非阻塞的I/O模型,也是I/O多路複用的基礎。主要有三大核心部分組成:Channel(通道),Buffer(緩衝區), Selector(選擇器)。傳統IO是基於字節流和字符流進行操作(基於流),而NIO基於Channel和Buffer(緩衝區)進行操作,數據總是從通道讀取到緩衝區中,或者從緩衝區寫入到通道中。(簡單介紹,日常開發其實很少用到,除非是中間件研發專家。屬於面試造火箭了

用途:

應用到大型應用服務器,解決高併發與大量連接、I/O處理問題。如大量用戶在線的聊天服務器,視頻直播等。

4.LinkList和ArrayList的區別,插入,查詢比較

LinkList和ArrayList都是List的實現類,ArrayList 底層是動態數組,查詢快,插入慢,有移動的動作;LinkedList 底層是鏈表, 插入快,查詢慢。

5.java bean爲什麼要實現序列化

  1. 持久存儲,將對象的狀態保存在存儲媒體中以便可以在以後重新創建出完全相同的副本
  2. 按值封送,尤其是在分佈式系統中。如果對象標記爲 Serializable,則該對象將被自動序列化,並從一個應用程序域傳輸至另一個應用程序域,然後進行反序列化,從而在第二個應用程序域中產生出該對 象的一個精確副本
  3. 實現serializable接口的作用是就是可以把對象存到字節流,然後可以恢復

6.redis爲什麼這麼快----底層設計原理

redis是一個內存數據庫,是使用內存存儲,沒有磁盤IO上的開銷;還有使用單個線程處理請求,避免了多個線程之間線程切換和鎖資源爭用的開銷;使用多路複用IO技術,在poll,epool,kqueue選擇最優IO實現;有諸多可以直接應用的優化數據結構的實現,應用層可以直接使用原生的數據結構提升性能

7.常見的幾種分佈式鎖,redis鎖的用法

redis,zookeeper,數據庫實現的三種分佈式鎖;通過redis在Java中的setnx和get方法,設置獲取鎖的標誌位,哪個進程獲取redis鎖的標誌位,誰就可以執行代碼塊,其他進程隊列等待。

接着補問:如果redis併發鎖的服務宕了,搶奪鎖資源的隊列怎麼處理?

不好意思,開發的業務場景真沒處理過這種問題。哈哈。這塊瞭解的不夠深入。

8.線程池的實現原理和應用場景,參數配置

線程池原理:

提交一個任務到線程池中,線程池的處理流程如下:

1)判斷核心線程池是否都在執行任務,如果不是(核心線程空閒或者還有核心線程沒有被創建也就是沒有達到核心線程大小),則創建一個新的工作線程來執行任務。如果核心線程都在執行任務,則進入下個流程。

2)判斷線程池的緩存隊列是否已滿,如果沒滿,則將新提交的任務存儲在這個工作隊列中,否則進入下個流程。

3)判斷最大線程池裏的線程是否都處於工作狀態也就是是否達到了最大線程池個數,如果沒有,則創建一個新的工作線程來執行任務,如果已經滿了,則交給飽和策略來處理這個任務
目的:減少在創建和銷燬線程上所花的時間以及系統資源的開銷 ,如不使用線程池,有可能造成系統創建大量線程而導致消耗完系統內存以及”過度切換”。

應用場景:

  1. 單個任務處理的時間比較短 
  2. 需處理的任務的數量大

參數設置:

以ThreadPoolExecutor參數設置爲例


ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
  1. corePoolSize 線程池核心線程大小
  2. maximumPoolSize 線程池最大線程數量
  3. keepAliveTime 空閒線程存活時間
  4. unit 空間線程存活時間單位
  5. workQueue 工作隊列
  6. threadFactory 線程工廠
  7. handler 拒絕策略。當工作隊列中的任務已到達最大限制,並且線程池中的線程數量也達到最大限制,這時如果有新任務提交進來,該如何處理呢。這裏採用拒絕策略。這裏不詳細介紹了。

9.java虛擬機垃圾回收機制,tomcat的jvm參數配置

粗略回答,這個問題當時看書時間有點長,淡忘了。首先判斷對象是否可被回收,採用計數算法或可達性分析算法進行判斷。

jvm參數配置

tomcat的catalina.sh文件進行服務器的JVM參數配置。日常開發只涉及到最大堆內存的配置,比較low啊,所以JVM調優這塊工作還是接觸比較少的。

JAVA_OPTS="-Xmx4096m -XX:MetaspaceSize=1024m -XX:MaxMetaspaceSize=1024m -Xss4m"
CATALINA_OPTS="-Djava.awt.headless=true"

10.紅黑樹原理(回答不好)

回答:一個平衡的二叉搜索數,不熟悉,沒好好複習。數據結構是硬傷。。。

11.談談多租戶模型(回答不好)

回答:SaaS,是一種軟件架構技術,沒詳細瞭解

12.微服務的分佈式事務怎麼實現的,同時調用多個微服務接口時(回答不是很好)

回答:分佈式事務在微服務中可以有seata框架集成實現,也可以通過分佈式消息中間件kafka來實現業務的一致性和實時性。例如在商城交易系統中,爲了保證用戶下單模塊,支付模塊和物流模塊的一致性,可以使用kafka作爲消息中間件,用戶支付成功時,支付模塊作爲生產者向kafka發送一條消息,kafka接收到消息後,持久化存儲,物流模塊監聽消費掉該條消息後,做相應的業務處理,從而保證了該交易系統下單交易的ACID屬性。

13.kafka如何避免消息丟失(回答不是很好)

       看kafka生產環境的消息接收量,如果消息接收量比較小,日接收不過萬條,建議採用同步發送的方式。同步發送發出消息後,必須阻塞等待收到通知,才能發送下一條消息。這樣既能保證不丟失消息,又能保證順序。

       但是如果kafka的吞吐量很大,每天接收的數據很大。那就只能採用異步發送的方式了。異步發送消息之後回調函數,發送成功就發送下一條,發送失敗就記在日誌中,等着定時腳本來掃描。(回答粗糙簡陋

14.一條查詢SQL的執行流程,底層原理

  1. 客戶端把語句發給服務器端執行
  2. 客戶端把 SQL 語句傳送到服務器,服務器進程對該語句進行解析
  3. 語句合法性檢查
  4. 語言含義檢查
  5. 獲得對象解析鎖
  6. 數據訪問權限的核對
  7. 確定最佳執行計劃
  8. 語句執行
  9. 提取數據

15.談談類加載的雙親委派機制(回答不好)

        某個特定的類加載器在接到加載類的請求時,首先將加載任務委託給父類加載器,依次遞歸,如果父類加載器可以完成類加載任務,就成功返回;只有父類加載器無法完成此加載任務時,才自己去加載

16.談談mysql與oracle的分頁

這個問題比較簡單,就舉例了兩條SQL

mySQL分頁方式:

select * from table limit 3,5;--查詢table從第3頁開始,每頁5條數據 

Oracle分頁方式:

select rownum,rowid,tt.* from table tt where rownum<=3 and sex=1 and  rownum>=2

17.對SpringBoot的瞭解,個性化配置

簡單介紹了SpringBoot的開發便捷性,無配置化開發。個性化設置介紹了定製個性banner。屬於入門級面試題

18.通過反射機制獲取的對象跟new 的對象有什麼區別,哪個更快,爲什麼不通過反射機制直接獲取對象

在使用反射機制獲取對象時,必須確保這個類已經加載且已經連接,使用new的時候,這個類可以沒有被加載,也可以已經被加載;new關鍵字是強類型的,效率較高。反射是弱類型的,效率低;反射只是提供了一種更加靈活的方式創建對象,獲取對象的信息。

19.SpringCloud的介紹,熔斷機制(回答不是很好)

首先介紹了SpringCloud微服務框架的各大組件,及其作用。SpringCloud的熔斷機制主要是Hystrix框架來實現的,主要是在使用Feign客戶端調用其他服務接口時,如果該服務調用超時,異常或不可用,Hystrix就會fallback切斷與服務的連接。

20.數據庫的分佈式事務(回答不好)

      事務是數據庫管理系統執行過程中的一個邏輯單位,它能保證一組數據庫操作要麼全部執行,要麼全不執行,我們能夠通過事務將數據庫從一個狀態遷移到另一個狀態,在每一個狀態中,數據庫中的數據都保持一致性。分佈式事務其實也是事務,只是由於業務上的定義以及微服務架構設計的問題,所以需要在多個服務之間保證業務的事務性,也就是 ACID 四個特性;從單機的數據庫事務變成分佈式事務時,原有單機中相對可靠的方法調用以及進程間通信方式已經沒有辦法使用,同時由於網絡通信經常是不穩定的,所以服務之間信息的傳遞會出現障礙。(怎麼設計數據庫的分佈式事務不瞭解

21.如何看待出差和加班

適度加班可以接受,短期出差也可以接受。

22.最近在看什麼書,研究什麼新技術

《收穫,不止SQL優化》,《億級流量網站架構核心技術》,《Spring Cloud微服務架構開發實戰》。。。

23.你對公司工作有什麼要問的

。。。。

 

       一個半小時的電話面試結束了,感覺回答的不是很好,主要是沒怎麼準備,更別說背什麼面試題,都是根據自己日常在開發和處理問題的經驗來回答的。面試結束,面試官讓等通知。

二面:項目面

1.這個項目幾個人開發,你負責哪些模塊,一些模塊的實現細節

 

2.深入交談模塊所使用技術的底層原理

 

3.你遇到的最深刻最難的幾個問題,怎麼處理的

 

4.某個模塊,你跟同事是怎麼協作開發的,跟前端開發怎麼對接,跟底層協議開發怎麼對接

 

5.能自己搭建一個微服務項目嗎

 

6.一個加載很慢的模塊,你是怎麼優化的,介紹下優化的方法和步驟

 

二面進行了大約30分鐘,自我感覺還很良好,畢竟都是介紹自己做的東西,表達很順暢流利。

 

三面:HrBP面

      hr面是談經歷,談生活,談未來,扯皮的,這就不總結了。hr面試過了一天,就通知面試過了,在走offer發起流程,過了幾天郵件發了offer和入職注意事項。

 

 

 

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