主頁 >  其他 > 2020程式員必看這份JVM大廠高頻面試題與知識點整合!

2020程式員必看這份JVM大廠高頻面試題與知識點整合!

2020-12-05 07:35:22 其他

市面上各類 JVM 相關的資料雖多,但是明顯存在兩個極端:過于生澀難懂,或者流于某個技巧點而不系統化,同時各大公司也都越來越重視推動和發展 JVM 相關技術,一線大廠技術面試現在 JVM 知識也是必考科目,

在這個背景下,我全面梳理了系統化學習 JVM 的知識和經驗,包括 JVM 的技術和記憶體模型,JVM 引數和內置工具,GC 演算法,GC 日志、記憶體和執行緒等相關問題排查分析,以及常見的面試問題深度剖析等高級的進階方法與實戰,既滿足大家快速系統化學習和全面掌握知識的需求,又兼顧大家的面試經驗輔導, 需要的可以點擊這里!!!暗號博客園

JVM面試題

1. 記憶體模型以及磁區,需要詳細到每個區放什么,

2. 堆里面的磁區:Eden,survival (from+ to),老年代,各自的特點,

3. 物件創建方法,物件的記憶體分配,物件的訪問定位,

4. GC 的兩種判定方法: 

5. SafePoint 是什么

6. GC 的三種收集方法:標記清除、標記整理、復制演算法的原理與特點,分別用在什么地方,如果讓你優化收集方法,有什么思路?

7. GC 收集器有哪些?CMS 收集器與 G1 收集器的特點,

8. Minor GC 與 Full GC 分別在什么時候發生?

9. 幾種常用的記憶體除錯工具:jmap、jstack、jconsole、jhat

10. 類加載的幾個程序:

11. JVM 記憶體分哪幾個區,每個區的作用是什么?

12. 如和判斷一個物件是否存活?(或者 GC 物件的判定方法)

13. 簡述 java 垃圾回識訓制?

14. java 中垃圾收集的方法有哪些?

15. java 記憶體模型

16. java 類加載程序?

17. 簡述 java 類加載機制?

18. 類加載器雙親委派模型機制?

19. 什么是類加載器,類加載器有哪些?

20. 簡述 java 記憶體分配與回收策率以及 Minor GC 和Major GC

21.怎么獲取 Java 程式使用的記憶體?堆使用的百分比?

22.Java 中堆和堆疊有什么區別?

23.描述一下 JVM 加載 Class 檔案的原理機制?

24. 什么是tomcat類加載機制?

25.Java 堆的結構是什么樣子的?

26. 什么是GC調優?

27. 簡述各個版本記憶體區域的變化?

28. Java 中會存在記憶體泄漏嗎,簡述一下?

29. 垃圾回收的優點和原理,并考慮 2 種回識訓制?基本原理是什么?

30. 什么是分布式垃圾回收(DGC)?它是如何作業的?

31. 講講你理解的性能評價及測驗指標?

32. 常用的性能優化方式有哪些?

32. 說說分布式快取和一致性哈希?

 

JVM知識點

**JVM**

(1) 基本概念:
JVM是可運行Java代碼的假想計算機,包括一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收,堆和一個存盤方法域,JVM是運行在作業系統之上的,它與硬體沒有直接的互動,
![在這里插入圖片描述](https://img-blog.csdnimg.cn/20201204160947865.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NzM0NTA4NA==,size_16,color_FFFFFF,t_70)

(2) 運行程序:
我們都知道Java源檔案,通過編譯器,能夠生產相應的.Class檔案,也就是位元組碼檔案,而位元組碼檔案又通過Java虛擬機中的解釋器,編譯成特定機器上的機器碼,也就是如下:①Java源檔案—->編譯器—->位元組碼檔案②位元組碼檔案—->JVM—->機器碼每一種平臺的解釋器是不同的,但是實作的虛擬機是相同的,這也就是Java為什么能夠跨平臺的原因了,當一個程式從開始運行,這時虛擬機就開始實體化了,多個程式啟動就會存在多個虛擬機實體,程式退出或者關閉,則虛擬機實體消亡,多個虛擬機實體之間資料不能共享,


**2.執行緒**
這里所說的執行緒指程式執行程序中的一個執行緒物體,JVM 允許一個應用并發執行多個執行緒,Hotspot JVM 中的Java 執行緒與原生作業系統執行緒有直接的映射關系,當執行緒本地存盤、緩沖區分配、同步物件、堆疊、程式計數器等準備好以后,就會創建一個作業系統原生執行緒,Java 執行緒結束,原生執行緒隨之被回收,作業系統負責調度所有執行緒,并把它們分配到任何可用的CPU 上,當原生執行緒初始化完畢,就會呼叫Java 執行緒的run() 方法,當執行緒結束時,會釋放原生執行緒和Java 執行緒的所有資源,

HotspotJVM 后臺運行的系統執行緒主要有下面幾個:

虛擬機執行緒(VM thread):這個執行緒等待JVM 到達安全點操作出現,這些操作必須要在獨立的執行緒里執行,因為當堆修改無法進行時,執行緒都需要JVM 位于安全點,這些操作的型別有:stop-the-world 垃圾回收、執行緒堆疊dump、執行緒暫停、執行緒偏向鎖(biased locking)解除,

周期性任務執行緒:這執行緒負責定時器事件(也就是中斷),用來調度周期性操作的執行,

GC 執行緒:這些執行緒支持JVM 中不同的垃圾回識訓動,

編譯器執行緒:這些執行緒在運行時將位元組碼動態編譯成本地平臺相關的機器碼,

信號分發執行緒:這個執行緒接收發送到JVM 的信號并呼叫適當的JVM 方法處理

3.JVM記憶體區域

JVM記憶體區域主要分為執行緒私有區域【程式計數器、虛擬機堆疊、本地方法區】、執行緒共享區域【JAVA堆、方法區】、直接記憶體,執行緒私有資料區域生命周期與執行緒相同,

依賴用戶執行緒的啟動/結束而創建/銷毀(在HotspotVM內,每個執行緒都與作業系統的本地執行緒直接映射,因此這部分記憶體區域的存/否跟隨本地執行緒的生/死對應),

 

執行緒共享區域隨虛擬機的啟動/關閉而創建/銷毀,

直接記憶體并不是JVM運行時資料區的一部分,但也會被頻繁的使用:在JDK 1.4引入的NIO提供了基于Channel與Buffer的IO方式,它可以使用Native函式庫直接分配堆外記憶體,然后使用DirectByteBuffer物件作為這塊記憶體的參考進行操作(詳見:Java I/O擴展),這樣就避免了在Java堆和Native堆中來回復制資料,因此在一些場景中可以顯著提高性能,

3.程式計數器(執行緒私有)

一塊較小的記憶體空間,是當前執行緒所執行的位元組碼的行號指示器,每條執行緒都要有一個獨立的程式計數器,這類記憶體也稱為“執行緒私有”的記憶體,正在執行java方法的話,計數器記錄的是虛擬機位元組碼指令的地址(當前指令的地址),如果還是Native方法,則為空,這個記憶體區域是唯一一個在虛擬機中沒有規定任何OutOfMemoryError情況的區域,

4虛擬機堆疊(執行緒私有)

是描述java方法執行的記憶體模型,每個法在執行的同時都會創建一個堆疊幀(Stack Frame)用于存盤區域變數表、運算元堆疊、動態鏈接、方法出口等資訊,每一個方法從呼叫直至執行完成的程序,就對應著一個堆疊幀在虛擬機堆疊中入堆疊到出堆疊的程序,

堆疊幀(Frame)是用來存盤資料和部分程序結果的資料結構,同時也被用來處理動態鏈接(Dynamic Linking)、方法回傳值和例外分派(Dispatch Exception),堆疊幀隨著方法呼叫而創建,隨著方法結束而銷毀——無論方法是正常完成還是例外完成(拋出了在方法內未被捕獲的例外)都算作方法結束,

5.本地方法區(執行緒私有)

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


6.堆(Heap-執行緒共享)-運行時資料區


是被執行緒共享的一塊記憶體區域,創建的物件和陣列都保存在Java堆記憶體中,也是垃圾收集器進行垃圾收集的最重要的記憶體區域,由于現代VM采用分代收集演算法,因此Java堆從GC的角度還可以細分為:新生代(Eden 區、From Survivor 區和To Survivor 區)和老年代,
 

7.方法區l永久代(執行緒共享)


即我們常說的永久代(Permanent Generation),用于存盤被JVM加載的類資訊、常量、靜態變數、即時編譯器編譯后的代碼等資料. HotSpot VM把GC分代收集擴展至方法區,即使用Java堆的永久代來實作方法區,這樣HotSpot的垃圾收集器就可以像管理Java堆一樣管理這部分記憶體,而不必為方法區開發專門的記憶體管理器(永久帶的記憶體回收的主要目標是針對常量池的回收和型別的卸載,因此收益一般很小),
運行時常量池(Runtime Constant Pool)是方法區的一部分,Class檔案中除了有類的版本、欄位、方法、介面等描述等資訊外,還有一項資訊是常量池
(Constant Pool Table),用于存放編譯期生成的各種字面量和符號參考,這部分內容將在類加載后存放到方法區的運行時常量池中,Java 虛擬機對Class檔案的每一部分(自然也包括常量池)的格式都有嚴格的規定,每一個位元組用于存盤哪種資料都必須符合規范上的要求,這樣才會被虛擬機認可、裝載和執行,
 

8.JVM運行時記憶體

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

2.3.1.新生代

是用來存放新生的物件,一般占據堆的1/3空間,由于頻繁創建物件,所以新生代會頻繁觸發MinorGC進行垃圾回收,新生代又分為Eden區、ServivorFrom、ServivorTo三個區,

1.Eden區Java新物件的出生地(如果新創建的物件占用記憶體很大,則直接分配到老年代),當Eden區記憶體不夠的時候就會觸發MinorGC,對新生代區進行一次垃圾回收,

2.ServivorFrom上一次GC的幸存者,作為這一次GC的被掃描者,

3.ServivorTo保留了一次MinorGC程序中的幸存者,

4.MinorGC的程序(復制->清空->互換)MinorGC采用復制演算法,

1: eden、servicorFrom復制到ServicorTo,年齡+1
首先,把Eden和ServivorFrom區域中存活的物件復制到ServicorTo區域(如果有物件的年齡以及達到了老年的標準,則賦值到老年代區),同時把這些物件的年齡+1(如果ServicorTo不夠位置了就放到老年區);
2:清空eden、servicorFrom
然后,清空Eden和ServicorFrom 中的物件;
3: ServicorTo和 ServicorFrom互換
最后,ServicorTo和ServicorFrom互換,原ServicorTo成為下一次GC時的ServicorFrom區,

9.老年代

主要存放應用程式中生命周期長的記憶體物件,
老年代的物件比較穩定,所以MajorGC 不會頻繁執行,在進行MajorGC前一般都先進行了一次 MinorGC,使得有新生代的物件晉身入老年代,導致空間不夠用時才觸發,當無法找到足夠大的連續空間分配給新創建的較大物件時也會提前觸發一次MajorGC進行垃圾回收騰出空間,
MajorGC采用標記清除演算法:首先掃描一次所有老年代,標記出存活的物件,然后回收沒有標記的物件,MajorGC的耗時比較長,因為要掃描再回收,MajorGC 會產生記憶體碎片,為了減少記憶體損耗,我們一般需要進行合并或者標記出來方便下次直接分配,當老年代也滿了裝不下的時候,就會拋出OOM (Out of Memory)例外,
 

10.永久代


指記憶體的永久保存區域,主要存放Class 和Meta(元資料)的資訊,Class在被加載的時候被放入永久區域,它和和存放實體的區域不同,GC不會在主程式運行期對永久區域進行清理,所以這也導致了永久代的區域會隨著加載的Class的增多而脹滿,最終拋出OOM例外,

11.垃圾回收與演算法

12.如何確定垃圾


1.參考計數法
在Java 中,參考和物件是有關聯的,如果要操作物件則必須用參考進行,因此,很顯然一個簡單的辦法是通過參考計數來判斷一個物件是否可以回收,簡單說,即一個物件如果沒有任何與之關聯的參考,即他們的參考計數都不為О,則說明物件不太可能再被用到,那么這個物件就是可回收物件,


2.可達性分析
為了解決參考計數法的回圈參考問題,Java 使用了可達性分析的方法,通過一系列的“GC roots"物件作為起點搜索,如果在“GC roots”和一個物件之間沒有可達路徑,則稱該物件是不可達的,要注意的是,不可達物件不等價于可回收物件,不可達物件變為可回收物件至少要經過兩次標記程序,兩次標記后仍然是可回收物件,則將面臨回收,

13.標記清除演算法(Mark-Sweep)


最基礎的垃圾回收演算法,分為兩個階段,標注和清除,標記階段標記出所有需要回收的物件,清除階段回收被標記的物件所占用的空間,如圖

從圖中我們就可以發現,該演算法最大的問題是記憶體碎片化嚴重,后續可能發生大物件不能找到可利用空間的問題,

總結

所有的面試題目都不是一成不變的,特別是像一線大廠,上面的面試真題只是給大家一個借鑒作用,最主要的是給自己增加知識的儲備,有備無患,

給大家分享整理的2019年大廠JVM面試題資料(20多頁pdf檔案)以及多家公司java面試題資料100多頁pdf檔案和各知識點學習路線思維腦圖(xmind)還有JVM講解視頻,需要的可以點擊這里!!!暗號博客園

 

2019年一線大廠最全JVM面試100問!你能答對多少?

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/230204.html

標籤:其他

上一篇:程式員學編程如何入門、進階?一位碼農從四個方面談談他的理解

下一篇:努力就一定會有進步嗎?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more