想漲薪?掌握這套JVM核心知識,中軟國際Java面試題

前端小梅子 2021-09-18 04:34:13 阅读数:413

掌握 jvm 核心 心知 java

線程

這裏所說的線程指程序執行過程中的一個線程實體。JVM 允許一個應用並發執行多個線程。**Hotspot JVM 中的 Java 線程與原生操作系統線程有直接的映射關系。**當線程本地存儲、緩沖區分配、同步對象、棧、程序計數器等准備好以後,就會創建一個操作系統原生線程。Java 線程結束,原生線程隨之被回收。操作系統負責調度所有線程,並把它們分配到任何可用的 CPU 上。當原生線程初始化完畢,就會調用 Java 線程的 run() 方法。當線程結束時,會釋放原生線程和 Java 線程的所有資源。

Hotspot JVM 後臺運行的系統線程主要有下面幾個:

想漲薪?掌握這套JVM核心知識,中軟國際Java面試題_後端


JVM 內存區域

想漲薪?掌握這套JVM核心知識,中軟國際Java面試題_程序員_02

想漲薪?掌握這套JVM核心知識,中軟國際Java面試題_後端_03

JVM 內存區域主要分為線程私有區域【程序計數器、虛擬機棧、本地方法區】、線程共享區域【JAVA 堆、方法區】、直接內存。

線程私有數據區域生命周期與線程相同, 依賴用戶線程的啟動/結束 而 創建/銷毀(在 HotspotVM 內,?每個線程都與操作系統的本地線程直接映射, 因此這部分內存區域的存/否跟隨本地線程的生/死對應)。

線程共享區域隨虛擬機的啟動/關閉而創建/銷毀。

直接內存並不是 JVM 運行時數據區的一部分,?但也會被頻繁的使用: 在 JDK 1.4 引入的?NIO 提供了基於 Channel 與 Buffer 的 IO 方式, 它可以使用 Native 函數庫直接分配堆外內存, 然後使用DirectByteBuffer 對象作為這塊內存的引用進行操作(詳見: Java I/O 擴展), 這樣就避免了在 Java堆和 Native 堆中來回複制數據, 因此在一些場景中可以顯著提高性能。

想漲薪?掌握這套JVM核心知識,中軟國際Java面試題_後端_04

1、程序計數器(線程私有)

一塊較小的內存空間, 是當前線程所執行的字節碼的行號指示器,每條線程都要有一個獨立的程序計數器,這類內存也稱為“線程私有”的內存。

正在執行 java 方法的話,計數器記錄的是虛擬機字節碼指令的地址(當前指令的地址)。如果還是Native 方法,則為空。

這個內存區域是唯一一個在虛擬機中沒有規定任何 OutOfMemoryError 情况的區域。

2、虛擬機棧(線程私有)

**是描述java方法執行的內存模型,每個方法在執行的同時都會創建一個棧幀(Stack Frame)用於存儲局部變量錶、操作數棧、動態鏈接、方法出口等信息。**每一個方法從調用直至執行完成的過程,就對應著一個棧幀在虛擬機棧中入棧到出棧的過程。

棧幀( Frame)是用來存儲數據和部分過程結果的數據結構,同時也被用來處理動態鏈接(Dynamic Linking)、 方法返回值和异常分派( Dispatch Exception)。棧幀隨著方法調用而創建,隨著方法結束而銷毀——無論方法是正常完成還是异常完成(拋出了在方法內未被捕獲的异常)都算作方法結束。

想漲薪?掌握這套JVM核心知識,中軟國際Java面試題_程序員_05

3、本地方法區(線程私有)

本地方法區和 Java Stack 作用類似, 區別是虛擬機棧為執行 Java 方法服務, 而本地方法棧則為Native 方法服務, 如果一個 VM 實現使用 C-linkage 模型來支持 Native 調用, 那麼該棧將會是一個C 棧,但 HotSpot VM 直接就把本地方法棧和虛擬機棧合二為一。

4、堆(Heap-線程共享)-運行時數據區

是被線程共享的一塊內存區域,創建的對象和數組都保存在 Java 堆內存中,也是垃圾收集器進行垃圾收集的最重要的內存區域。由於現代 VM 采用分代收集算法, 因此 Java 堆從 GC 的角度還可以細分為:?新生代(Eden 區、From Survivor 區和 To Survivor 區)和老年代。

5、方法區/永久代(線程共享)

即我們常說的永久代(Permanent Generation), 用於存儲被 JVM 加載的類信息常量靜態變量即時編譯器編譯後的代碼等數據. HotSpot VM把GC分代收集擴展至方法區, 即使用Java堆的永久代來實現方法區, 這樣 HotSpot 的垃圾收集器就可以像管理 Java 堆一樣管理這部分內存,而不必為方法區開發專門的內存管理器(永久帶的內存回收的主要目標是針對常量池的回收類型的卸載, 因此收益一般很小)。

運行時常量池(Runtime Constant Pool)是方法區的一部分。Class 文件中除了有類的版本、字段、方法、接口等描述等信息外,還有一項信息是常量池(Constant Pool Table),用於存放編譯期生成的各種字面量和符號引用,這部分內容將在類加載後存放到方法區的運行時常量池中。 Java 虛擬機對Class 文件的每一部分(自然也包括常量池)的格式都有嚴格的規定,每一個字節用於存儲哪種數據都必須符合規範上的要求,這樣才會被虛擬機認可、裝載和執行。


JVM 運行時內存

想漲薪?掌握這套JVM核心知識,中軟國際Java面試題_程序員_06

Java 堆從 GC 的角度還可以細分為:新生代(Eden 區、From Survivor 區和 To Survivor 區)和老年代。

想漲薪?掌握這套JVM核心知識,中軟國際Java面試題_後端_07


垃圾回收與算法

想漲薪?掌握這套JVM核心知識,中軟國際Java面試題_Java_08

想漲薪?掌握這套JVM核心知識,中軟國際Java面試題_Java_09


JAVA 四種引用類型

想漲薪?掌握這套JVM核心知識,中軟國際Java面試題_程序員_10

1、强引用

在 Java 中最常見的就是强引用,把一個對象賦給一個引用變量,這個引用變量就是一個强引用。當一個對象被强引用變量引用時,它處於可達狀態,它是不可能被垃圾回收機制回收的,即使該對象以後永遠都不會被用到 JVM 也不會回收。因此强引用是造成 Java 內存泄漏的主要原因之一。

2、軟引用

軟引用需要用 SoftReference 類來實現,對於只有軟引用的對象來說,當系統內存足够時它不會被回收,當系統內存空間不足時它會被回收。軟引用通常用在對內存敏感的程序中。

3、弱引用

弱引用需要用 WeakReference 類來實現,它比軟引用的生存期更短,對於只有弱引用的對象來說,只要垃圾回收機制一運行,不管 JVM 的內存空間是否足够,總會回收該對象占用的內存。

4、虛引用

虛引用需要 PhantomReference 類來實現,它不能單獨使用,必須和引用隊列聯合使用。虛引用的主要作用是跟踪對象被垃圾回收的狀態。


GC 分代收集算法 VS 分區收集算法

總結

互聯網大廠比較喜歡的人才特點:對技術有熱情,强硬的技術基礎實力;主動,善於團隊協作,善於總結思考。無論是哪家公司,都很重視高並發高可用技術,重視基礎,所以千萬別小看任何知識。面試是一個雙向選擇的過程,不要抱著畏懼的心態去面試,不利於自己的發揮。同時看中的應該不止薪資,還要看你是不是真的喜歡這家公司,是不是能真的得到鍛煉。其實我寫了這麼多,只是我自己的總結,並不一定適用於所有人,相信經過一些面試,大家都會有這些感觸。

**另外本人還整理收藏了2021年多家公司面試知識點以及各種技術點整理 **

 CodeChina開源項目:【一線大廠Java面試題解析+核心總結學習筆記+最新講解視頻】

下面有部分截圖希望能對大家有所幫助。

想漲薪?掌握這套JVM核心知識,中軟國際Java面試題_Java_11

版权声明:本文为[前端小梅子]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/09/20210918043412580m.html