2019百度與阿里秋招面經總結3(後續)

14. 瞭解jdk12的新特性嗎,說說G1的新功能吧

可中斷的G1
如果G1混合集合可能超過暫停目標,則使其可以中止。

如果G1發現啓發式的收集重複的選擇錯誤的區域數,及收集預測不準確的時候,會切換到更復雜的方式來執行收集:將需收集的內容拆分爲兩個部分,強制部分和可選部分。強制性部分包括G1不能逐步收集處理的部分(例如年輕代),但也可以包含老年代以提高效率。例如,強制部分可以是預測的收集部分的80%。剩餘的20%(僅由老年代組成)構成可選部分。

G1完成強制部分的收集後,如果還有剩餘時間,G1會以更細粒度的級別開始收集可選部分。此可選部分的收集粒度取決於剩餘的時間量,一次最多隻能到一個區域。完成對可選部分的收集後,G1可以根據剩餘時間決定停止集合。

隨着收集預測再次變得準確,可選部分變得越來越小,直到強制部分再次包含所有待收集部分(即,G1完全依賴於其啓發式)。如果預測再次變得不準確,則下一個集合將再次包含強制和可選部分。

通過G1更及時的返回未使用的內存
增強G1垃圾收集器,以便在空閒時自動將Java堆內存返回給操作系統

爲了實現向操作系統返回最大內存量的目標,G1將在應用程序不活動期間定期嘗試或觸發併發週期以確定整體Java堆使用情況。這將導致它自動將Java堆的未使用部分返回給操作系統。同時,用戶可主動選擇full gc ,從而最大化的返回的未使用內存。

15.說說計算機網絡的層次、按照5層來說吧

物理層,數據鏈路層,網絡層,傳輸層和應用層。
物理層是最低部的一層,主要是用來傳輸比特,解決網絡中的異構問題。
數據鏈路層在物理層之上,他的作用主要是把數據封裝成幀,實現簡單的數據校驗功能。
網絡層中的主要協議是ip協議,主要是通過ip協議在網絡中去尋找ip地址對應的主機。
傳輸層兩大協議是TCP協議和UDP協議,提供了可靠傳輸和巨量傳輸兩種模式給上層,上層可以通過傳輸層中的協議進行端到端的數據傳輸。
應用層是最上面一層,主要是爲了適配各式各樣應用的網絡模塊設計,比如瀏覽器使用http協議和80端口,但其他應用的協議又不同,應用層就是爲了不同應用而存在的。

16.Spring Boot與Spring的區別是什麼

Spring Boot可以建立獨立的Spring應用程序;
內嵌瞭如Tomcat,Jetty和Undertow這樣的容器,也就是說可以直接跑起來,用不着再做部署工作了。
無需再像Spring那樣搞一堆繁瑣的xml文件的配置;
可以自動配置Spring;
提供了一些現有的功能,如量度工具,表單數據驗證以及一些外部配置這樣的一些第三方功能;
提供的POM可以簡化Maven的配置;

Spring 框架就像一個家族,有衆多衍生產品例如 boot、security、jpa等等。
但他們的基礎都是Spring 的 ioc和 aop ioc 提供了依賴注入的容器 aop ,解決了面向橫切面的編程,然後在此兩者的基礎上實現了其他延伸產品的高級功能。Spring MVC是基於 Servlet 的一個 MVC 框架 主要解決 WEB 開發的問題,因爲 Spring 的配置非常複雜,各種XML、 JavaConfig、hin處理起來比較繁瑣。於是爲了簡化開發者的使用,從而創造性地推出了Spring boot,約定優於配置,簡化了spring的配置流程。

說得更簡便一些:Spring 最初利用“工廠模式”(DI)和“代理模式”(AOP)解耦應用組件。大家覺得挺好用,於是按照這種模式搞了一個 MVC框架(一些用Spring 解耦的組件),用開發 web 應用( SpringMVC )。然後有發現每次開發都寫很多樣板代碼,爲了簡化工作流程,於是開發出了一些“懶人整合包”(starter),這套就是 Spring Boot。

17.說下Spring AOP中的動態代理吧

①JDK動態代理只提供接口的代理,不支持類的代理。核心InvocationHandler接口和Proxy類,InvocationHandler 通過invoke()方法反射來調用目標類中的代碼,動態地將橫切邏輯和業務編織在一起;接着,Proxy利用 InvocationHandler動態創建一個符合某一接口的的實例, 生成目標類的代理對象。

②如果代理類沒有實現 InvocationHandler 接口,那麼Spring AOP會選擇使用CGLIB來動態代理目標類。CGLIB(Code Generation Library),是一個代碼生成的類庫,可以在運行時動態的生成指定類的一個子類對象,並覆蓋其中特定方法並添加增強代碼,從而實現AOP。CGLIB是通過繼承的方式做的動態代理,因此如果某個類被標記爲final,那麼它是無法使用CGLIB做動態代理的。

18.知道Spring 框架的事物傳播行爲嗎?

主要有七個,
(1)propagation_required:傳播行爲,這是默認的事物傳播機制。上下文存在事務則將事務加入到事務中執行,否則新建事務然後在執行。
(2)propagation_support:支持行爲,它表示上下文如果存在事務那麼就支持事務加入事務,否則就以非事務的方式進行執行。
(3)propagation_mandatory:強制行爲,他表示上下文必須存在事務否則就拋出異常!
(4)propagation_not_support:不支持行爲,他表示如果上下文存在事務那就將事務直接掛起,等當前邏輯執行完才恢復上下文事務。
(5)propagation_requires_new:它表示每次都要新建一個新的事務,並且將上下文事務掛起,等待事務執行完之後再將上下文事務恢復執行。
(6)propagation_never:他表示上下文絕不能存在事務,否則就拋出runtime異常。
(7)propagation_nested:嵌入行爲,它表示如果存在上下文事務,那就嵌入到上下文事務中執行,如果不存在事務那就會新建事務。

19.如果服務器卡住了,不能dump數據怎麼辦

通過ps命令查詢進程,看一下哪個進程有異常,如果是數據庫進程的問題,那可能就是發生了死鎖或者大量線程查詢擁塞了。如果是java進程卡住了可能就是發生了邏輯錯誤或者大量請求使服務器宕機了。

20.如果客戶端禁止 cookie, 能實現 session 還能用嗎?

因爲禁用Cookie就不能得到Session,但是可以通過其他方式使用session
Cookie與 Session,一般認爲是兩個獨立的東西,Session採用的是在服務器端保持狀態的方案,而Cookie採用的是在客戶端保持狀態的方案。因爲Session是用Session ID來確定當前對話所對應的服務器Session,而Session ID是通過Cookie來傳遞的,禁用Cookie相當於失去了Session ID,也就得不到Session了。假定用戶關閉Cookie的情況下使用Session,其實現途徑有以下幾種:1.手動通過URL傳值、隱藏表單傳遞Session ID。2.用文件、數據庫等形式保存Session ID,在跨頁過程中手動調用。

21.在你的項目中你什麼進行異常處理的

我的項目主要技術點就是使用的Spring,在SpringMVC中的流程鏈中會捕捉未處理Runtime異常並進行事務回滾。我利用了SpringMVC這一特性,先自己DIY了幾個不同的異常類,這些異常類都繼承自Runtime異常,保證了SpringMVC能夠捕捉到他們。
主要有用戶操作異常,系統操作異常和參數校驗異常,用戶操作異常就是業務方面的異常,系統操作異常就是IO操作這些異常,參數校驗異常是我對用戶上傳的參數都會進行校驗,校驗不通過時拋出異常。然後在SpringMVC中使用一個全局異常處理分別捕捉不同的異常並進行處理,處理的原則就是返回給用戶友好的信息,打印異常日誌以做記錄,嚴重時給維護人員報警。
這樣做的好處就是可以統一去處理異常,還能利用Spring捕獲異常時發生的事務回滾,保證數據完整性。

22.你的項目什麼場景中會用到多線程?描述一下

使用線程池的地方就會用到多線程
定時任務,如定時清除用戶產生的臨時數據,用戶身份校驗,
登錄信息監測、垃圾清理、郵件分發、信息更新…

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