1. 程式人生 > >Java面試常見問題——JVM 記憶體管理

Java面試常見問題——JVM 記憶體管理

JVM 記憶體管理

既然是 Java 開發面試,那麼對 JVM 的考察當然也是必須的,面試官一般會問你對 JVM 有了解嗎?

我通常都會把我所瞭解的都說一遍,包括:JVM 記憶體劃分、JVM 垃圾回收的含義,有哪些 GC 演算法,年輕代和老年代各自的特點統統闡述一遍。

01. JVM 記憶體劃分:

  1. 方法區(執行緒共享):常量、靜態變數、JIT(即時編譯器) 編譯後的程式碼也都在方法區;

  2. 堆記憶體(執行緒共享):垃圾回收的主要場所;

  3. 程式計數器: 當前執行緒執行的位元組碼的位置指示器;

  4. 虛擬機器棧(棧記憶體):儲存區域性變數、基本資料型別變數以及堆記憶體中某個物件的引用變數;

  5. 本地方法棧 :為 JVM 提供使用 native 方法的服務。

02. 類似-Xms、-Xmn 這些引數的含義:

答:

堆記憶體分配:

  1. JVM 初始分配的記憶體由-Xms 指定,預設是實體記憶體的 1/64;

  2. JVM 最大分配的記憶體由-Xmx 指定,預設是實體記憶體的 1/4;

  3. 預設空餘堆記憶體小於 40% 時,JVM 就會增大堆直到-Xmx 的最大限制;空餘堆記憶體大於 70% 時,JVM 會減少堆直到 -Xms 的最小限制;

  4. 因此伺服器一般設定-Xms、-Xmx 相等以避免在每次 GC 後調整堆的大小。物件的堆記憶體由稱為垃圾回收器的自動記憶體管理系統回收。

非堆記憶體分配:

  1. JVM 使用-XX:PermSize 設定非堆記憶體初始值,預設是實體記憶體的 1/64;

  2. 由 XX:MaxPermSize 設定最大非堆記憶體的大小,預設是實體記憶體的 1/4;

  3. -Xmn2G:設定年輕代大小為 2G;

  4. -XX:SurvivorRatio,設定年輕代中 Eden 區與 Survivor 區的比值。

03. 垃圾回收演算法有哪些?

答:

  1. 引用計數 :原理是此物件有一個引用,即增加一個計數,刪除一個引用則減少一個計數。垃圾回收時,只用收集計數為 0 的物件。此演算法最致命的是無法處理迴圈引用的問題;

  2. 標記-清除 :此演算法執行分兩階段。第一階段從引用根節點開始標記所有被引用的物件,第二階段遍歷整個堆,把未標記的物件清除;

    此演算法需要暫停整個應用,同時,會產生記憶體碎片;

  3. 複製演算法 :此演算法把記憶體空間劃為兩個相等的區域,每次只使用其中一個區域。垃圾回收時,遍歷當前使用區域,把正在使用中的物件複製到另外一個區域中;

    此演算法每次只處理正在使用中的物件,因此複製成本比較小,同時複製過去以後還能進行相應的記憶體整理,不會出現 “碎片” 問題。當然,此演算法的缺點也是很明顯的,就是需要兩倍記憶體空間;

  4. 標記-整理 :此演算法結合了 “標記-清除” 和 “複製” 兩個演算法的優點。也是分兩階段,第一階段從根節點開始標記所有被引用物件,第二階段遍歷整個堆,把清除未標記物件並且把存活物件 “壓縮” 到堆的其中一塊,按順序排放。

    此演算法避免了 “標記-清除” 的碎片問題,同時也避免了 “複製” 演算法的空間問題。

04. root 搜尋演算法中,哪些可以作為 root?

答:

  • 被啟動類(bootstrap 載入器)載入的類和建立的物件;

  • JavaStack 中的引用的物件 (棧記憶體中引用的物件);

  • 方法區中靜態引用指向的物件;

  • 方法區中常量引用指向的物件;

  • Native 方法中 JNI 引用的物件。

05. GC 什麼時候開始?

答:

GC 經常發生的區域是堆區,堆區還可以細分為新生代、老年代,新生代還分為一個 Eden 區和兩個 Survivor 區。

  1. 物件優先在 Eden 中分配,當 Eden 中沒有足夠空間時,虛擬機器將發生一次 Minor GC,因為 Java 大多數物件都是朝生夕滅,所以 Minor GC 非常頻繁,而且速度也很快;

  2. Full GC,發生在老年代的 GC,當老年代沒有足夠的空間時即發生 Full GC,發生 Full GC 一般都會有一次 Minor GC。

    大物件直接進入老年代,如很長的字串陣列,虛擬機器提供一個;XX:PretenureSizeThreadhold 引數,令大於這個引數值的物件直接在老年代中分配,避免在 Eden 區和兩個 Survivor 區發生大量的記憶體拷貝;

  3. 發生 Minor GC 時,虛擬機器會檢測之前每次晉升到老年代的平均大小是否大於老年代的剩餘空間大小,如果大於,則進行一次 Full GC,如果小於,則檢視 HandlePromotionFailure 設定是否允許擔保失敗,如果允許,那隻會進行一次 Minor GC,如果不允許,則改為進行一次 Full GC。

06. 記憶體洩漏和記憶體溢位

答:

概念:

  1. 記憶體溢位指的是記憶體不夠用了;

  2. 記憶體洩漏是指物件可達,但是沒用了。即本該被 GC 回收的物件並沒有被回收;

  3. 記憶體洩露是導致記憶體溢位的原因之一;記憶體洩露積累起來將導致記憶體溢位。

記憶體洩漏的原因分析:

  1. 長生命週期的物件引用短生命週期的物件;

  2. 沒有將無用物件置為 null。

小結:本小節涉及到 JVM 虛擬機器,包括對記憶體的管理等知識,相對較深。除了以上問題,面試官會繼續問你一些比較深的問題,可能也是為了看看你的極限在哪裡吧。

比如:記憶體調優、記憶體管理,是否遇到過記憶體洩漏的實際案例、是否真正關心過記憶體等。由於本人實際專案經驗不足,這些深層次問題並沒有接觸過,各位有需要可以上網查閱。

相關推薦

Java面試常見問題——JVM 記憶體管理

JVM 記憶體管理既然是 Java 開發面試,那麼對 JVM 的考察當然也是必須的,面試官一般會問你對 JVM 有了解嗎?我通常都會把我所瞭解的都說一遍,包括:JVM 記憶體劃分、JVM 垃圾回收的含義

深入淺出 JavaJVM 記憶體管理

  Java崗位面試,JVM是對程式設計師基本功考察,通常會問你對JVM瞭解嗎?   可以分幾部分回答這個問題,首先JVM記憶體劃分 | JVM垃圾回收的含義  |  有哪些GC演算法  以及年輕代和老年代各自特點等

Java】【JVMJavaJVM記憶體管理 2018-10-5

Java中JVM記憶體管理 JVM記憶體劃分: ① 方法區 (執行緒共享) 常量 靜態變數 JIT(即時編譯器)編譯後代碼也在方法區存放 ② 堆記憶體(執行緒共享) 垃圾回收的主要場地 ③

深入理解Java虛擬機器(二) --- JVM記憶體管理

執行時的資料區域 一.程式計數器 目的:作為當前執行緒所執行位元組碼的行號指示器 原理:通過位元組碼直譯器改變計數器的值來選取下一條位元組碼指令 特點: 1.佔用較小的記憶體空間 ​ 2.每條執行緒需要一個獨立的程式計數器 ​ 3.

JVM記憶體管理JAVA效能調優相關筆記

JVM篇 1.JVM記憶體分配:方法區、Java棧、本地方法棧、堆、程式計數器。方法區:在方法區中,儲存了每個類的資訊(包括類的名稱、方法資訊、欄位資訊)、靜態變數、常量以及編譯器編譯後的程式碼等。Java棧:用來儲存方法中的區域性變數(包括在方法中宣告的非靜態變數以及函式形參)。對於基本資料型別的

Java記憶體 -JVM 記憶體管理

一.綜述 如果你學過C或者C++,那麼你應該感受過它們對記憶體那種強大的掌控力。但是強大的能力往往需要更強大的控制力才能保證能力不被濫用,如果濫用C/C++的記憶體管理那麼很容易出現指標滿天飛的情況,不出問題還好,一出問題debug起來簡直讓人頭疼得不要不要的。借用一句話,“指標一時爽,重構火葬場”。

java虛擬機器記憶體管理機制(一):JVM記憶體管理總結【分享】

近期看了看Java記憶體洩露的一些案例,跟原來的幾個哥們討論了一下,深入研究發現JVM裡面還是有不少以前不知道的細節,這裡稍微剖析一下。先看一看JVM的內部結構——如圖所示,JVM主要包括兩個子系統和兩個元件。兩個子系統分別是Class loader子系統和Execution

Java之美[從菜鳥到高手演變]之JVM記憶體管理及垃圾回收

很多Java面試的時候,都會問到有關Java垃圾回收的問題,提到垃圾回收肯定要涉及到JVM記憶體管理機制,Java語言的執行效率一直被C、C++程式設計師所嘲笑,其實,事實就是這樣,Java在執行效率方面確實很低,一方面,Java語言採用面向物件思想,這也決定了其必然是開發效

JVM記憶體管理的角度談談JAVA類的靜態方法和靜態屬性

JVM的記憶體分為兩部分: stack(棧)是JVM的記憶體指令區。stack管理很簡單,push一定長度位元組的資料或者指令,stack指標壓棧相應的位元組位移; pop一定位元組長度資料或者指令,stack指標彈棧。stack的速度很快,管理很簡單,並且每次操作的資料或

java虛擬機器JVM--java虛擬機器的記憶體管理(新生代、老年代)

前言 在上一篇部落格中,還遺留了一個問題:JVM的記憶體如何分配最高效?換一種說法就是:JVM的記憶體是如何的分配以及回收的?通過前面兩篇部落格的鋪墊:java虛擬機器JVM–java虛擬機器的結構, java虛擬機器JVM–java虛擬機器垃圾的回收機制詳解

Java面試01|JVM相關

pen 虛擬機 圖形 最大值 之前 memory adding obj 分析 1、JVM內存查看與分析,編寫內存泄露實例 堆區、棧區、方法區、本機內存都有可能內存溢出。在這裏編寫堆區內存溢出實例。如下(來自《深入理解Java虛擬機》一書。 // -Xms20m

Java面試常見

完整 對稱加密 bfs tro 遍歷算法 加載 com mysql 1-1 Java開發崗位面試常問題 一、Java基礎 1、String類為什麽是final的. 2、HashMap的源碼,實現原理,底層結構. 3、說說你知道的幾個Java集合類:lis

三、Java虛擬機器自動記憶體管理機制、物件建立及記憶體分配

  1、物件是如何建立: 步驟:    (1)、虛擬機器遇到new <類名>的指令---->根據new的引數是否在常量池中定位一個類的符號引用    (2)、檢測該符號引用代表的類是否已經被載入、解析、和初始化。(如果沒有則

Java面試-常見基礎筆試題目

1. Vector, ArrayList, LinkedList的區別   Vector:①長度可變,以類似陣列的形式儲存於記憶體中,執行緒安全(同步),因為其大部分方法都有synchronized 關鍵字,正因為是同步的,所以進行頻繁的資料操作時,必然會導致效能的下降。       ②當增加的

再問jvm記憶體管理

——jvm為什麼年輕代一定要劃分成兩個區域,為什麼老年代不分,為什麼一定要分代。 1、為什麼要分代:   分代的唯一理由就是優化GC效能。如果沒有分代,那我們所有的物件都在一塊,GC的時候我們要找到哪些物件沒用,這樣就會對堆的所有區域進行掃描。而我們的很多物件都是朝生夕死的,如果分代的話,我們把新建立的物

詳解JVM記憶體管理與垃圾回收機制1 - 記憶體管理

Java應用程式是執行在JVM上的,得益於JVM的記憶體管理和垃圾收集機制,開發人員的效率得到了顯著提升,也不容易出現記憶體溢位和洩漏問題。但正是因為開發人員把記憶體的控制權交給了JVM,一旦出現記憶體方面的問題,如果不瞭解JVM的工作原理,將很難排查錯誤。本文將從理論角度介紹虛擬機器的記憶

詳解JVM記憶體管理與垃圾回收機制2 - 何為垃圾

隨著程式語言的發展,GC的功能不斷增強,效能也不斷提高,作為語言背後的無名英雄,GC離我們的工作似乎越來越遠。作為Java程式設計師,對這一點也許會有更深的體會,我們不需要了解太多與GC相關的知識,就能很好的完成工作。那還有必要深入瞭解GC嗎?學習GC的意義在哪兒? 不管效能提高到何種程

二、Java虛擬機器自動記憶體管理機制、執行時資料區域深入瞭解

執行時資料區域:     (1)、程式計數器         a、定義:是一塊較小的記憶體空間,可以看作是當前執行緒所執行的位元組碼的行號指示器。         b、執行緒私有:因為多執行緒是通過執行緒輪流切換並且分配處理器執行時間的方式來實現的,任何時刻,        

Java面試--常見的邊界控制問題

常見的邊界控制問題 二分查詢 例 【二分查詢】  在有序陣列中查詢元素 k ,返回 k 所在的下標 在陣列 [1,2,10,15,100] 中去尋找 15 ,15 的下標是 3 ; 二分查詢思路: 程式碼實現:BinarySearch.java packa

JVM記憶體管理調優

執行時資料區是JVM把自己管理的記憶體部分抽象出來的模型,抽象出來的不同的資料區域,以便於管理,具體有程式計數器、堆、棧、本地方法棧和方法區這幾個區域。這幾個區域有的會產生記憶體溢位的問題,在實際生產中會導致服務不可用,所以確保機器的魯棒性,JVM調優是不可忽視的一環。 物件回收判斷 在