1. 程式人生 > >java架構之路-(面試篇)JVM虛擬機器面試大全

java架構之路-(面試篇)JVM虛擬機器面試大全

  下文連線比較多啊,都是我過整理的部落格,很多答案都在部落格裡有詳細說明,理解記憶是最紮實的記憶。而且我的答案不一定是最準確的,但是我的答案不會讓你失望,而且幾乎每個答案都是問題的擴充套件答案。

1.JVM記憶體模型

  答:https://www.cnblogs.com/cxiaocai/p/11483629.html  

先經過類裝載子系統裝載,經由驗證,準備,解析,初始化四個過程。方法被呼叫,方法進棧,物件放在堆,棧記憶體的引用指向我們的物件,方法逐行執行,由我們的程式計數器來控制。元空間放置靜態方法,不佔用jvm記憶體,佔用的是實際記憶體空間。 

2.JVM垃圾回收演算法

  答:三種演算法。https://www.cnblogs.com/cxiaocai/p/11547743.html

  複製演算法,由一個記憶體塊複製到一個記憶體塊下,缺點是有一半的記憶體是留給複製用的,不用用於直接儲存

  標記清理,掃逐個記憶體塊是否可被回收,可以回收的就回收掉,缺點是會產生記憶體碎片

  標記整理,標記整理是是標記清除的升級版,優點:解決記憶體碎片問題。缺點:整理階段,由於移動了可用物件,需要去更新引用。

3.JVM垃圾收集器有哪些?以及優劣勢比較?

  答:https://www.cnblogs.com/cxiaocai/p/11547743.html

  有五種垃圾回收器,分別是序列的Serial,並行的ParNew,高CPU的Parallel Scavenge,還有我們的CMS和大記憶體的G1。

  需要說的是CMS回收器的過程,初始標記(STW),併發標記,重新標記(STW,耗時70%),併發清理 ,併發重置。

  G1回收器適合大記憶體的伺服器,回收過程是,初始標記(STW),併發標記,最終標記(STW),篩選回收(STW)。

  G1回收器的優點是STW時間是可以控制的。序列的Serial,自我覺得沒啥優點,唯一的優點就是清理的徹底吧。並行的ParNew,開啟多個執行緒去回收,一般來說執行緒數和CPU的核數相等,但不建議用在老年代,在老年代相容性差。高CPU的Parallel Scavenge可能會搶佔使用者執行緒的CPU。CMS回收器需要考慮到老年代擔保機制。

  https://www.cnblogs.com/cxiaocai/p/11570519.html

  再就是G1三個GC都是什麼YoungGC優先判斷一下回收一次的工作效率,不值得不執行。MixedGC清理記憶體塊,複製演算法,Full GC停止系統程式,然後採用單執行緒進行標記、清理和壓縮整理,好空閒出來一批Region來供下一次MixedGC使用

4.什麼是類的載入

  答案:https://www.cnblogs.com/cxiaocai/p/11483629.html 

    1.驗證:驗證我們的編譯檔案(位元組碼檔案)是否正確。

    2.準備:給予類的靜態常量開闢堆空間。並且賦予預設值。物件也在這個時候放置在堆空間,並且給予空值。

    3.解析:將符號引用替換為直接引用,該階段會把一些靜態方法(符號引用,比如main()方法)替換為指向資料所存記憶體的指標或控制代碼等(直接引用),這是所謂的靜態連結過程(類載入期間完成),動態連結是在程式執行期間完成的將符號引用替換為直接引用。就像是我們把main轉化為001,將()轉化為002,將這一系列的編碼存在堆上。

    4.初始化,將第3步的靜態常量(或物件)賦值,執行靜態程式碼塊。

5.簡述雙親委派

  答:https://www.cnblogs.com/cxiaocai/p/11483629.html

  這個簡單啦,別管幾層,下面給我的我一律不管,除非我是最頂層,上級交給我的,我看看我可以做嗎?做不了我給我下級。

  用技術一點的話就是類來了,交給我們的自定義載入器,自定義載入器先不做處理,交給我們的應用類載入器,應用類載入也先不處理,交給我們的擴充套件類載入器,擴充套件類載入器也先不處理,交給我們的啟動類載入器,啟動類載入器沒辦法了,先嚐試載入一下吧,載入不了,回退給擴充套件類載入器,擴充套件類載入器也嘗試一下載入吧,載入不了再交給我們的應用類載入器,應用類載入器還是處理不了只有回退給我們的自定義載入器了。

  自定我們的類載入器,只要重寫com.sun.org.apache.bcel.internal.util包下的ClassLoader類的findClass方法,最後呼叫defineClass方法。就可以實現我們的自定義載入器。  

6.簡述老年代擔保機制

  答:https://www.cnblogs.com/cxiaocai/p/11520731.html

   Eden區滿了後,不會立即做MinorGC,會判斷一下老年代的剩餘空間是否大於我們要回收的物件,夠大就做MinorGC吧,如果老年代不夠大了,我們會判斷時候配置了-XX:-HandlePromotionFailure (jdk8以上預設設定),沒配置,直接FullGC,如果配置了就去判斷老年代的剩餘空間是否小於我們每次minorGC後每次要放在老年代物件大小的平均值,如果老年代小於minorGC了,那麼進行fullGC。

7.Java物件建立過程

  答:為物件分配儲存空間。開始構造物件。遞迴呼叫其超類的構造方法。進行物件例項初始化與變數初始化。執行構造方法體。使用完畢,計算GCRoot根,也就是物件不可達分析,進行垃圾回收,觸發finalize方法,方法執行結束,稍後進行垃圾回收。

8.類的生命週期

  答:類的完整生命週期包括7個部分:載入——驗證——準備——解析——初始化——使用——解除安裝

 9.如何判斷物件可以被回收?

  答:1,引用計數法(基本不用,迴圈引用物件永遠無法銷燬,可能記憶體溢位)

    2,可達性分析演算法。GCRoots根節點一般為執行緒棧的本地變數、靜態變數、本地方法棧的變數等等。

    3,常見的引用型別(強軟弱虛)。

    4,finalize最終判斷物件存活。

    如何判斷一個類是無用的類

    1.該類所有的例項都已經被回收,也就是 Java 堆中不存在該類的任何 例項。     2.載入該類的 ClassLoader 已經被回收。         3.該類對應的 java.lang.Class物件沒有在任何地方被引用,無法在任何地方通過反射訪問該類的方法。 

10.JVM的永久代中會發生垃圾回收麼?

  答:永生代也是可以回收的,條件是

    1.該類的例項都被回收。

    2.載入該類的classLoader已經被回收

    3.該類不能通過反射訪問到其方法,而且該類的java.lang.class沒有被引用 當滿足這3個條件時,是可以回收,但回不回收還得看jvm有沒有“時間”。

11.一般用什麼來分析GC日誌分析

  答:jmap -heap PID,jstat -gc PID,javap -c ***.class,線上盡力別用jvisualvm命令,消耗效能,想快速優化(完全不熟悉業務)可以直接通過調整eden,Survivor區來設定,記得為什麼會發生fullGC,兩個重要的一個動態年齡計算,另一個是老年代擔保機制,熟悉業務時,可以結合業務來調整,而且在專案上線前,應該做提前的預估。

12.調優命令

  答:

  棧相關 

    -Xss->設定單個執行緒棧大小,比如-Xss512K,數值越小,一個執行緒棧裡能分配的棧幀就越少,說明可以開啟的執行緒數越多 

  方法區(元空間)

    -XX:MetaspaceSize->設定方法區的大小,也是觸發GC的閾值,比如-XX:MetaspaceSize=256M

    -XX:MaxMetaspaceSiz->設定方法區的最大值,比如-XX:MaxMetaspaceSize=256M 

  堆相關

    -Xms->jvm啟動時分配的記憶體,比如‐Xms200m

    -Xmx->jvm執行過程中分配的最大記憶體,比如-Xmx500m

    -Xmn->設定年輕代大小,比如-Xmn2g

    -XX:NewSize->設定年輕代大小 比如-XX:NewSize=2g

    -XX:PretenureSizeThreshold->可以設定大物件的大小,比如-XX:PretenureSizeThreshold=100000000 單位為btye。

    -XX:MaxTenuringThreshold->設定分代年齡,比如-XX:MaxTenuringThreshold=10 預設為15。

    -XX:-HandlePromotionFailure->老年代分配擔保機制引數,1.8預設開啟。

    -XX:-UseAdaptiveSizePolicy->禁止JVM自動優化eden和Survivor預設比例8:1:1,反之JVM預設有這個引數-XX:+UseAdaptiveSizePolicy,會導致這個比例自動變化。

    -XX:SurvivorRatio->設定Eden和Survivor大小比如 -XX:SurvivorRatio =8,注意Survivor區有兩個。表示Eden:Survivor=8:2,一個Survivor區佔整個年輕代的1/10。 

    -XX:NewRatio->設定老年代和年輕代的比值大小 比如-XX:NewRatio=4,表示年老代和年輕代比值為4:1。

  還有很多的命令就不依依列舉了,可以去看我的部落格https://www.cnblogs.com/cxiaocai/p/11570519.html

13.Minor GC與Full GC分別在什麼時候發生?

  答:Minor GC發生在年輕代,當eden區滿的時候會出發Minor GC。

    Full GC發生在老年代,回收所有堆空間的記憶體,Minor GC前的老年代擔保機制可能出發FullGC。

14.簡述物件動態年齡判斷

  答:https://www.cnblogs.com/cxiaocai/p/11520731.html 

  當我們做完minorGC以後,物件放在to區域,也就是我們Survivor的to區域,可能物件是放不下的,這時會來計算分類年齡,大致是這樣來算的將所有分代年齡為1的相加,再加上分代年齡為2的,再加分代年齡為3的,依次相加,一直加到最大的分代年齡,但在相加過程中,你會發現加到分代年齡為m的物件,總大小已經放滿了to區域,這時就將m到n分代年齡的物件都移置到老年代,包含m。也就是大於Survivor區域的50%時,則後面的物件,包含該年齡的物件都放置在老年代。

15.類的例項化順序,比如父類靜態資料,建構函式,欄位,子類靜態資料,建構函式,欄位,他們的執行順序

  答:當建立類物件時,先初始化靜態變數和靜態塊,然後是非靜態變數和非靜態程式碼塊,然後是構造器。由於靜態成員只會被初始化一次,所以如果靜態成員已經被初始化過,將不會被再次初始化。

16.簡述一下逃逸分析

  答:-XX:+DoEscapeAnalysis : 表示開啟逃逸分析。-XX:-DoEscapeAnalysis : 表示關閉逃逸分析 從jdk 1.7開始已經預設開始逃逸分析,如需關閉,需要指定-XX:-DoEscapeAnalysis。逃逸是指在某個方法之內建立的物件,除了在方法體之內被引用之外,還在方法體之外被其它變數引用到;這樣帶來的後果是在該方法執行完畢之後,該方法中建立的物件將無法被GC回收,由於其被其它變數引用。正常的方法呼叫中,方法體中建立的物件將在執行完畢之後,將回收其中建立的物件;故由於無法回收,即成為逃逸。

關注公眾號獲得更多面試和學習資料。

相關推薦

java架構-面試JVM虛擬機器面試大全

  下文連線比較多啊,都是我過整理的部落格,很多答案都在部落格裡有詳細說明,理解記憶是最紮實的記憶。而且我的答案不一定是最準確的,但是我的答案不會讓你失望,而且幾乎每個答案都是問題的擴充套件答案。 1.JVM記憶體模型   答:https://www.cnblogs.com/cxiaocai/p/114836

java架構-SpringMVCSpringMVC主要流程原始碼解析原始碼執行流程

  做過web專案的小夥伴,對於SpringMVC,Struts2都是在熟悉不過了,再就是我們比較古老的servlet,我們先來複習一下我們的servlet生命週期。 servlet生命週期 1)初始化階段   當客戶端向 Servlet 容器發出 HTTP 請求要求訪問 Servlet 時,Servlet

java架構-Redis專題redis面試助力滿分+

1.Redis支援的資料型別? 答:五種,在第一節redis相關的部落格我就說過,String,Hash,List,Set,zSet,也就是我們的字串,雜湊,列表,集合,有序集合五種。結構圖如下。  2.什麼是Redis持久化?Redis有哪幾種持久化方式?優缺點是什麼? 答:Redis持久化主

java架構-設計模式五種建立型模式單例模式

  設計模式自身一直不是很瞭解,但其實我們時刻都在使用這些設計模式的,java有23種設計模式和6大原則。 設計模式是一套被反覆使用、多數人知曉的、經過分類編目的、程式碼設計經驗的總結。使用設計模式是為了可重用程式碼、讓程式碼更容易被他人理解、保證程式碼可靠性、程式的重用性。 其中包含 建立型模式,共五種:單

java架構-分散式zookeeperzookeeper叢集配置和選舉機制詳解

  上次部落格我們說了一下zookeeper的配置檔案,以及命令的使用https://www.cnblogs.com/cxiaocai/p/11597465.html。我們這次來說一下我們的zookeeper的叢集配置和java的API相關操作。 叢集:   一般情況下我們用zookeeper來做任務排程中心

java架構-Redis專題Redis的高效能和持久化

  上次我們簡單的說了一下我們的redis的安裝和使用,這次我們來說說redis為什麼那麼快和持久化資料   在我們現有的redis中(5.0.*之前的版本),Redis都是單執行緒的,那麼單執行緒的Redis為什麼還會有那麼高的效率呢?因為它所有的資料都在記憶體中,所有的運算都是記憶體級別的運算,而且單執行

java架構-Redis專題Redis的主從、哨兵和叢集

  我們使用的redis,單機的絕對做不到高可用的,萬一單機的redis宕機了,就沒有備用的了,我們可以採用叢集的方式來保證我們的高可用操作。 主從架構      大致就是這樣的,一個主節點,兩個從節點(一般兩個就可以了) 主從工作原理    如果你為master配置了一個slave,不管這個sla

java架構-Redis專題SpringBoot連線Redis超簡單

  上次我們搭建了Redis的主從架構,哨兵架構以及我們的叢集架構,但是我們一直還未投入到實戰中去,這次我們用jedis和springboot兩種方式來操作一下我們的redis 主從架構   如何配置我上次已經講過了,https://www.cnblogs.com/cxiaocai/p/11711377.ht

java架構-Redis專題簡單聊聊redis分散式鎖

  這次我們來簡單說說分散式鎖,我記得過去我也過一篇JMM的記憶體一致性演算法,就是說拿到鎖的可以繼續操作,沒拿到的自旋等待。 思路與場景   我們在Zookeeper中提到過分散式鎖,這裡我們先用redis實現一個簡單的分散式鎖,這裡是我們一個簡單的售賣減庫存的小例項,剩餘庫存假設存在資料庫內。 @Get

java架構-Redis專題聊聊大廠那些redis

  上幾次說了redis的主從,哨兵,叢集配置,但是內部的選舉一直沒說,先來簡單說一下選舉吧。 叢集選舉   redis cluster節點間採取gossip協議進行通訊,也就是說,在每一個節點間,無論主節點還是從節點,他們之間都是存在相互通訊的。例如你的redis埠號是6379,那麼你的gossip協議埠號

java架構-MQ專題RabbitMQ安裝和基本使用

RabbitMQ安裝   我這裡安裝是使用阿里雲的CentOS7.5來安裝的,使用CentOS版本低於7的可能會報錯。 1.安裝rabbitmq所需要的依賴包 輸入$ yum install build-essential openssl openssl-devel unixODBC unixODBC-dev

java架構-MQ專題RocketMQ從入坑到叢集詳解

  這次我們來說說我們的RocketMQ的安裝和引數配置,先來看一下我們RocketMQ的提出和應用場景吧。   早在2009年,阿里巴巴的淘寶第一次提出了雙11購物狂歡節,但是在2009年,伺服器無法承受到大規模的併發,導致了大規模宕機停運,當時還是IOE的服務架構,也就是沒有我們的訊息佇列中介軟體,直接由

java架構MQ專題kafka叢集配置和簡單使用

  前面我們說了RabbitMQ和RocketMQ的安裝和簡單的使用,這次我們說一下Kafka的安裝配置,後面我會用幾個真實案例來說一下MQ的真實使用場景。天冷了,不願意伸手,最近沒怎麼寫部落格了,還請見諒。 一、目標   1.知道什麼是Kafka   2.懂得kafka的單機和叢集安裝配置   3.瞭解內部

java架構-netty專題初步認識BIO、NIO、AIO

  本次我們主要來說一下我們的IO阻塞模型,只是不多,但是一定要理解,對於後面理解netty很重要的 IO模型精講    IO模型就是說用什麼樣的通道進行資料的傳送和接收,Java共支援3種網路程式設計IO模式:BIO,NIO,AIO。 BIO   BIO(Blocking IO) 同步阻塞模型,一

java架構-netty專題netty的基本使用和netty聊天室

上次回顧:   上次部落格,我們主要說了我們的IO模型,BIO同步阻塞,NIO同步非阻塞,AIO基於NIO二次封裝的非同步非阻塞,最重要的就是我們的NIO,腦海中應該有NIO的模型圖。 Netty概念:   Netty是由JBOSS提供的一個java開源框架,現為 Github上的獨立專案。Nett

java架構-netty專題netty的編解碼出入戰與粘包拆包

上次迴歸:   上次部落格我們主要說了netty的基本使用,都是一些固定的模式去寫的,我們只需要關注我們的攔截器怎麼去寫就可以了,然後我們用我們的基礎示例,改造了一個簡單的聊天室程式,可以看到內部加了一個StringEncoder和StringDecoder,這個就是用來編解碼我們字串的,這次我們就來說說這個

java架構-dubbo專題dubbo的基本使用

  今天我們來說一下dubbo的基本使用,沒有什麼高階的知識,真的超級簡單易懂。 Dubbo核心功能解釋   dubbo 阿里開源的一個SOA服務治理框架,從目前來看把它稱作是一個RPC遠端呼叫框架更為貼切。單從RPC框架來說,功能較完善,支援多種傳輸和序列化方案。所以想必大家已經知道他的核心功能了:就是遠

java架構-面試Mysql面試大全

  說一下mysql比較巨集觀的面試,具體咋寫sql的這裡就不過多舉例了。後面我還會給出一個關於mysql面試優化的試題,這裡主要說的索引和B+Tree結構,很少提到我們的叢集配置優化方案。 1.索引是什麼?有什麼作用以及缺點   答:索引是對資料庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問資料

java架構-spring原始碼由淺入深-spring實戰詳細使用

  今天我更新了一篇jvm垃圾回收的演算法和垃圾回收器的內部邏輯,但是看的人不多啊......貌似大家還是比較喜歡看原始碼吧,畢竟實戰要比理論用的多。   這篇文章不會詳細的深入底層原始碼,只是基於註解和配置來說說我們的spring的使用,別小看基礎,保證有你沒用過的註解和配置,走起。我們先來建立一個mave

java架構-spring原始碼springIOC容器原始碼解析

  我們這次來叭叭一下Spring的原始碼,這次部落格主要來說說Spring原始碼,先粗略的擼一遍,下篇部落格選幾個重點去說,由於過於複雜,我也是看了一點點,我們先來過一遍原始碼,然後上流程圖,最後我們再回頭總結一下,我們來循序漸進的叭叭一下。 我們來回顧一下上次Spring部落格的內容,每次都有用到Anno