一起吃麪筋 001

快春招了,小豪說吃麪筋能夠強身健體,因此烤了一些麪筋和大家一起分享。凡事就怕認真,每天喫一點,讓時間給你答案。

1.談談你對JVM的瞭解?

回答思路:JVM是什麼?它有什麼作用?

參考回答:JVM是Java虛擬機,是實現Java代碼平臺無關性的關鍵所在。Java源代碼通過編譯器生成字節碼文件,JVM加載字節碼文件,將其轉化爲能夠在特定平臺上運行的機器碼。

2.什麼是JVM內存區域?

回答思路:在腦海中回憶運行時數據區的示意圖,簡單說下每塊區域的特點、作用。
參考回答
運行時數據區先說下線程私有區,這裏就是簡單說各區域作用,記得啥說啥,不用說的很細。

虛擬機棧:棧也叫棧內存,主管Java程序的運行,是在線程創建時創建,生命週期跟隨線程的生命期,8種基本類型的變量+對象的引用變量+實例方法都是在棧內存中分配。每個方法執行的同時都會創建一個棧幀,用於存儲局部變量表、操作數棧、動態鏈接、方法出口等信息。如果線程請求的棧深度大於虛擬機所允許的深度,將拋出StackOverflowError異常,相當於你調用的棧指針指向爲空了。大多數虛擬機棧可以動態擴展,如果因爲內存原因導致虛擬機棧申請擴大內存沒得到允許,就會出現OutOfMemoryError異常。

本地方法棧: 作用類似於虛擬機棧,只不過作用對象是本地方法,而不是Java方法。與虛擬機棧一樣,本地方法棧也會拋出StackOverflowError和OutOfMemoryError異常。

程序計數器:當前線程所執行的字節碼的行號指示器,控制程序執行順序。此內存區域不用考慮OutOfMemoryError情況。

線程共享區包括堆和方法區

:此內存唯一目的就是存放對象實例,在虛擬機啓動時就創建,屬於線程共有區,是各種垃圾收集器和垃圾回收算法的主要戰場。如果在堆中沒有內存完成對象實例分配,並且堆也無法擴展,就會拋出OOM異常。

方法區:用於存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據。其中常量池用於存放編譯期生成的各種字面量和符號引用。當方法區無法滿足內存分配需求時,也會拋出OOM異常。

直接內存:直接內存不屬於虛擬機運行時數據區的一部分,但這部分內存也被頻繁使用,會導致OutOfMemoryError異常出現,因爲雖然本地直接內存的分配不受Java堆大小限制,但是卻會受到本機總內存大小以及處理器尋址空間限制。

3.垃圾收集算法有哪些?

回答思路:說清楚四種垃圾收集算法的思路是什麼?特點?適用場景?

參考回答
標記清除算法:首先標記出所有需要回收的對象,在標記完成後統一回收所有被標記的對象。效率問題,產生內存碎片問題。

複製算法:爲了解決效率問題,“複製”收集算法出現了。它可以將內存分爲大小相同的兩塊,每次使用其中的一塊。當這一塊的內存使用完後,就將還存活的對象複製到另一塊去,然後再把使用的空間一次清理掉。這樣就使每次的內存回收都是對內存區間的一半進行回收。有效內存空間只有一半問題。

標記整理算法:標記過程仍然與“標記-清除”算法一樣,但後續步驟不是直接對可回收對象回收,而是讓所有存活的對象向一端移動,然後直接清理掉端邊界以外的內存。移動對象效率問題。

分代收集算法:當前虛擬機的垃圾收集都採用分代收集算法,這種算法沒有什麼新的思想,只是根據對象存活週期的不同將內存分爲幾塊。一般將 java 堆分爲新生代和老年代,這樣我們就可以根據各個年代的特點選擇合適的垃圾收集算法。

比如在新生代中,每次收集都會有大量對象死去,所以可以選擇複製算法,只需要付出少量對象的複製成本就可以完成每次垃圾收集。而老年代的對象存活機率是比較高的,而且沒有額外的空間對它進行分配擔保,所以我們必須選擇“標記-清除”或“標記-整理”算法進行垃圾收集。

4.你瞭解哪些垃圾收集器?

回答思路:重點說清楚CMS垃圾收集器和G1垃圾收集器,各自回收過程?特點?優缺點?

參考回答
CMS: Concurrent Mark Sweep 垃圾收集器是以獲取最短回收停頓時間爲目標的收集器,併發進行垃圾回收(垃圾回收線程和用戶線程基本可以看作一起進行),採用標記清除算法,整個過程包括初始標記、併發標記、重新標記、併發清除。

優點:併發收集,停頓時間短; 缺點:對CPU資源敏感,無法處理浮動垃圾,產生內存碎片。

G1:G1 (Garbage-First) 是一款面向服務器的垃圾收集器,滿足GC停頓時間要求的同時還具備高吞吐量性能。回收過程包括初始標記、併發標記、篩選標記、篩選回收。

優點:並行併發、分代收集、空間整理、預測停頓;G1 收集器在後臺維護了一個優先列表,每次根據允許的收集時間,優先選擇回收價值最大的 Region(這也就是它的名字 Garbage-First 的由來)。這種使用 Region 劃分內存空間以及有優先級的區域回收方式,保證了 G1收集器在有限時間內可以儘可能高的收集效率(把內存化整爲零)。

5.創建線程的方式有幾種?

回答思路:常見的創建線程有四種方式。

參考回答
通過實現Runnable接口來創建線程

通過繼承Thread類來創建線程

通過實現Callable接口來創建線程

通過(Executor框架)線程池創建線程

6.怎麼保證多線程的運行安全性?

回答思路:有哪些安全性問題?分別怎麼解決?

參考回答
緩存導致的可見性問題、線程切換導致的原子性問題、編譯優化導致的有序性問題。
juc併發工具包裏面的Atomic原子類、Lock、Synchronized可以解決原子性問題。
Synchronized、Lock、volatile可以解決可見性問題。
Happens-Before 規則可以解決有序性問題。

7.關於多線程鎖的升級原理?

回答思路:鎖的級別有哪些?鎖升級的目的?升級過程和底層原理?

參考回答
鎖的級別從低到高:無鎖 -> 偏向鎖 -> 輕量級鎖 -> 重量級鎖

升級過程和原理:在鎖對象的對象頭裏有一個threadid字段,在第一次訪問的時候threadid爲空,jvm讓其持有偏向鎖,並將threadid設置爲其線程id,再次進入的時候會先判斷threadid是否與其線程id一致,如果一致則可以直接使用此對象,如果不一致,則升級偏向鎖爲輕量級鎖,其它線程通過自旋循環一定次數來獲取鎖,執行一定次數之後,其它線程如果還沒有正常獲取到要使用的對象,此時就會把鎖從輕量級升級爲重量級鎖,此過程就構成了synchronized鎖的升級。

升級目的:鎖升級是爲了減低鎖帶來的性能消耗。

8.HTTPS原理,以及安全的概念是怎樣理解的?

回答思路:重點放在HTTPS的加密通信原理的回答,最好是能夠回答出詳細的握手過程。

參考回答
HTTP協議運行在TCP之上,所有傳輸的內容都是明文,客戶端和服務器端都無法驗證對方的身份。HTTPS是運行在SSL/TLS之上的HTTP協議,SSL/TLS 運行在TCP之上。所有傳輸的內容都經過加密,加密採用對稱加密,但對稱加密的密鑰用服務器方的證書進行了非對稱加密。
流程示意圖

9.MySQL數據庫的事務以及事務的特性?

回答思路:事務的概念以及ACID特性。

參考回答
事務就是一個程序執行單元,裏面的操作要麼都做,要麼都不做。事務有四個非常重要的特性(ACID):

原子性(Atomicity):事務是不可分割的整體,所有操作要麼全做,要麼全不做;只要事務中有一個操作出錯,回滾到事務開始前狀態,即之前已執行的操作無效。

一致性(Consistency):事務執行前後,從一個一致性狀態到另一個一致性狀態;比如A向B轉賬(A、B總金額就是一個一致性狀態),不可能出現A扣了錢。B卻沒收到。

隔離性(Isolation):多個併發事務之間相互隔離, 不能相互干擾。

持久性(Durablity):事務完成後,對數據庫的更改是永久保存的,不能回滾。

10.MySQL的隔離級別?

回答思路:理解髒讀、不可重複讀、幻讀的概念,四種隔離級別分別能解決什麼問題?
參考回答

隔離級別 有四種,分別是:讀未提交、讀已提交、可重複讀、序列化。
  讀未提交: Read Uncommitted,顧名思義,就是一個事務可以讀取另一個未提交事務的數據。最低級別,它存在4個常見問題(髒讀、不可重複讀、幻讀、丟失更新)。
  讀已提交: Read Committed,顧名思義,就是一個事務要等另一個事務提交後才能讀取數據。 它解決了髒讀問題,存在3個常見問題(不可重複讀、幻讀、丟失更新)。
  可重複讀: Repeatable Read,就是在開始讀取數據(事務開啓)時,不再允許修改操作 。它解決了髒讀和不可重複讀,還存在2個常見問題(幻讀、丟失更新)。
  序列化: Serializable,序列化,或串行化。就是將每個事務按一定的順序去執行,它將隔離問題全部解決,但是這種事務隔離級別效率低下,比較耗數據庫性能,一般不使用。

11.談談你對SpringBoot的瞭解?

回答思路:是SpringBoot是什麼?優點?難點?
參考回答
Spring Boot 並不是一個框架,本質上其實就是一個基於Spring框架的應用。
優點:約定優於配置、自動裝配、內嵌服務器、yml配置支持、支持多種插件。
缺點:集成度較高,使用過程中不太容易瞭解底層。

12.SpringBoot是如何工作的?

回答思路:SpringBoot的啓動流程,緊接着肯定會問你源碼實現了。所以需要理解註解@SpringBootApplication和啓動類run()方法的底層原理,準備後續深挖的問題。
參考回答
Springboot啓動過程

更多

對我的文章感興趣,點個關注是對我最大的支持,持續更新中…
關注微信公衆號LearnJava:

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