前言:面試
居家隔離不要忘了學習呀,在家沒上沒下的時候學習是讓本身充實起來的好方法哦,相信不少人都在準備着年後或者是金三銀四面試跳槽,上班的時候說忙沒有時間學習,不敢跳槽由於毫無準備,如今趁着有點時間能夠學習充實下本身哦。算法
今天給你們整理分享一份Java核心面試知識點整理,但願能夠幫助到你們,因爲篇幅限制不能所有分享出來,須要完整的這份文檔資料,關注個人供種號【Java周某人】設計模式
26個知識點數組
Java基礎,集合,併發,多線程,JVM,設計模式緩存
Java算法,數據結構tomcat
Spring,MyBatis,MVC,netty,tomcat數據結構
架構設計,Redis緩存,Zookeeper,kafka,RabbitMQ,負載均衡多線程
SpringBoot,SpringCloud,Dubbo,Docker架構
我的以爲都適用,不論是小白仍是大牛,查漏補缺發現更厲害的你併發
因爲篇幅限制筆者選擇一個知識點給你們着重介紹,須要完整文檔資料的私信我哦
基本概念:
JVM 是可運行 Java 代碼的假想計算機 ,包括一套字節碼指令集、一組寄存器、一個棧、一個垃圾回收,堆 和 一個存儲方法域。JVM 是運行在操做系統之上的,它與硬件沒有直接的交互。
運行過程:
咱們都知道 Java 源文件,經過編譯器,可以生產相應的.Class 文件,也就是字節碼文件,而字節碼文件又經過 Java 虛擬機中的解釋器,編譯成特定機器上的機器碼 。
也就是以下:
① Java 源文件—->編譯器—->字節碼文件
② 字節碼文件—->JVM—->機器碼
每一種平臺的解釋器是不一樣的,可是實現的虛擬機是相同的,這也就是 Java 爲何可以跨平臺的緣由了 ,當一個程序從開始運行,這時虛擬機就開始實例化了,多個程序啓動就會存在多個虛擬機實例。程序退出或者關閉,則虛擬機實例消亡,多個虛擬機實例之間數據不能共享
線程
這裏所說的線程指程序執行過程當中的一個線程實體。JVM 容許一個應用併發執行多個線程。Hotspot JVM 中的 Java 線程與原生操做系統線程有直接的映射關係。當線程本地存儲、緩衝區分配、同步對象、棧、程序計數器等準備好之後,就會建立一個操做系統原生線程。Java 線程結束,原生線程隨之被回收。操做系統負責調度全部線程,並把它們分配到任何可用的 CPU 上。當原生線程初始化完畢,就會調用 Java 線程的 run() 方法。當線程結束時,會釋放原生線程和 Java 線程的全部資源.
Hotspot JVM 後臺運行的系統線程主要有下面幾個:
JVM 內存區域
JVM 內存區域主要分爲線程私有區域【程序計數器、虛擬機棧、本地方法區】、線程共享區域【JAVA 堆、方法區】、直接內存。
線程私有數據區域生命週期與線程相同, 依賴用戶線程的啓動/結束 而 建立/銷燬(在 HotspotVM 內, 每一個線程都與操做系統的本地線程直接映射, 所以這部份內存區域的存/否跟隨本地線程的生/死對應)
線程共享區域隨虛擬機的啓動/關閉而建立/銷燬。
直接內存並非 JVM 運行時數據區的一部分, 但也會被頻繁的使用: 在 JDK 1.4 引入的 NIO 提供了基於 Channel 與 Buffer 的 IO 方式, 它可使用 Native 函數庫直接分配堆外內存, 而後使用DirectByteBuffer 對象做爲這塊內存的引用進行操做(詳見: Java I/O 擴展), 這樣就避免了在 Java堆和 Native 堆中來回複製數據, 所以在一些場景中能夠顯著提升性能。
本地方法區(線程私有)
本地方法區和 Java Stack 做用相似, 區別是虛擬機棧爲執行 Java 方法服務, 而本地方法棧則爲Native 方法服務, 若是一個 VM 實現使用 C-linkage 模型來支持 Native 調用, 那麼該棧將會是一個C 棧,但 HotSpot VM 直接就把本地方法棧和虛擬機棧合二爲一。
堆(Heap-線程共享)-運行時數據區
是被線程共享的一塊內存區域,建立的對象和數組都保存在 Java 堆內存中,也是垃圾收集器進行垃圾收集的最重要的內存區域。因爲現代 VM 採用分代收集算法, 所以 Java 堆從 GC 的角度還能夠細分爲: 新生代(Eden 區、From Survivor 區和 To Survivor 區)和老年代。
方法區/永久代(線程共享)
即咱們常說的永久代(Permanent Generation), 用於存儲被 JVM 加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據. HotSpot VM把GC分代收集擴展至方法區, 即使用Java堆的永久代來實現方法區, 這樣 HotSpot 的垃圾收集器就能夠像管理 Java 堆同樣管理這部份內存,而沒必要爲方法區開發專門的內存管理器(永久帶的內存回收的主要目標是針對常量池的回收和類型的卸載, 所以收益通常很小)。運行時常量池(Runtime Constant Pool)是方法區的一部分。Class 文件中除了有類的版本、字段、方法、接口等描述等信息外,還有一項信息是常量池
(Constant Pool Table),用於存放編譯期生成的各類字面量和符號引用,這部份內容將在類加載後存放到方法區的運行時常量池中。 Java 虛擬機對 Class 文件的每一部分(天然也包括常量池)的格式都有嚴格的規定,每個字節用於存儲哪一種數據都必須符合規範上的要求,這樣纔會被虛擬機承認、裝載和執行。
垃圾回收與算法
如何肯定垃圾
引用計數法
在 Java 中,引用和對象是有關聯的。若是要操做對象則必須用引用進行。所以,很顯然一個簡單的辦法是經過引用計數來判斷一個對象是否能夠回收。簡單說,即一個對象若是沒有任何與之關聯的引用,即他們的引用計數都不爲 0,則說明對象不太可能再被用到,那麼這個對象就是可回收對象。
可達性分析
爲了解決引用計數法的循環引用問題,Java 使用了可達性分析的方法。經過一系列的「GC roots」對象做爲起點搜索。若是在「GC roots」和一個對象之間沒有可達路徑,則稱該對象是不可達的要注意的是,不可達對象不等價於可回收對象,不可達對象變爲可回收對象至少要通過兩次標記過程。兩次標記後仍然是可回收對象,則將面臨回收。
標記清除算法(Mark-Sweep)
複製算法(copying)
爲了解決 Mark-Sweep 算法內存碎片化的缺陷而被提出的算法。按內存容量將內存劃分爲等大小的兩塊。每次只使用其中一塊,當這一塊內存滿後將尚存活的對象複製到另外一塊上去,把已使用的內存清掉,如圖:
這種算法雖然實現簡單,內存效率高,不易產生碎片,可是最大的問題是可用內存被壓縮到了本來的一半。且存活對象增多的話,Copying 算法的效率會大大下降。
標記整理算法(Mark-Compact)
結合了以上兩個算法,爲了不缺陷而提出。標記階段和 Mark-Sweep 算法相同,標記後不是清理對象,而是將存活對象移向內存的一端。而後清除端邊界外的對象。如圖:
分代收集算法
分代收集法是目前大部分 JVM 所採用的方法,其核心思想是根據對象存活的不一樣生命週期將內存劃分爲不一樣的域,通常狀況下將 GC 堆劃分爲老生代(Tenured/Old Generation)和新生代(YoungGeneration)。老生代的特色是每次垃圾回收時只有少許對象須要被回收,新生代的特色是每次垃圾回收時都有大量垃圾須要被回收,所以能夠根據不一樣區域選擇不一樣的算法。
今天的jvm知識點就分享到這裏,還有一些內容沒有詳細的分享出來,文章前面提到的知識點內容都有詳細的解析分析,須要整個pdf文檔資料的,關注個人供種號【Java周某人】
全文共485頁這份PDF但是幫了我很大的忙哦