亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java面試題沖刺第二十七天--JVM2

 更新時間:2021年09月02日 09:26:14   作者:_陳哈哈  
這篇文章主要為大家分享了最有價值的三道關于JVM的面試題,涵蓋內容全面,包括數(shù)據結構和算法相關的題目、經典面試編程題等,感興趣的小伙伴們可以參考一下

面試題1:簡單說一下java的垃圾回收機制。

任何語言在運行過程中都會創(chuàng)建對象,也就意味著需要在內存中為這些對象在內存中分配空間,如果這些對象只增加不減少,那么堆空間很快就會被耗盡。因此在這些對象失去使用的意義的時候,需要釋放掉這些內容,保證內存能夠提供給新的對象使用,對于對象內存的釋放就是垃圾回收機制,也叫做gc(Garbage Collection,GC)。

對于java開發(fā)者來說gc是一個雙刃劍,像C語言的垃圾回收是人工的,工作量大,但是可控性高。而java是自動化的,但是可控性很差,甚至有時會出現(xiàn)內存溢出的情況,內存溢出也就是jvm分配的內存中對象過多,超出配置的JDK最大可分配內存的大小。

面試題2:JVM會在什么時候進行GC呢?

JVM常在以下幾種場景時進行GC操作:

  • 在cpu空閑的時候自動進行回收
  • 主動調用System.gc()后嘗試進行回收,是否回收由JVM決定。
  • Eden區(qū)域滿了,或者新創(chuàng)建的對象大小 > Eden所剩空間,執(zhí)行Minor GC。
  • 升到老年代的對象大于老年代剩余空間的時候執(zhí)行Full GC,或者Young GC中發(fā)生promotion failure`強制Full GC 。
  • 在堆內存存儲滿了之后進行GC,如gc與非gc時間耗時超過了GCTimeRatio的限制引發(fā)OOM

  YGC出現(xiàn)promotion failure的場景: promotion failure發(fā)生在Young GC, 如果Survivor區(qū)當中存活對象的年齡達到了設定值,會就將Survivor區(qū)當中的對象拷貝到老年代,如果老年代的空間不足,就會發(fā)生promotion failure, 強制進行Full GC 。

追問1:介紹一下不同代空間的垃圾回收機制

新生代(Young generation):

從年輕代空間(包括 Eden 和 Survivor 區(qū)域)回收內存被稱為 Minor GC,因為 Java 對象大多都具備朝生夕滅(很快不再使用)的特性,所以 Minor GC 非常頻繁,一般回收速度也比較快。這一定義既清晰又易于理解。。

老年代(Old generation):

對象沒有變得不可達,并且從新生代周期中存活了下來,會被拷貝到這里。其區(qū)域分配的空間要比新生代多。也正由于其相對大的空間,發(fā)生在老年代的GC次數(shù)要比新生代少得多。清理老年代內存一般直接是 Full GC來清理。

默認的新生代(Young generation)、老年代(Old generation)所占空間比例為 1 : 2 。

持久代(Permanent generation):

也稱之為方法區(qū)(Method area):用于保存類常量以及字符串常量。注意,這個區(qū)域不是用于存儲那些從老年代存活下來的對象,這個區(qū)域也可能發(fā)生GC。發(fā)生在這個區(qū)域的GC事件為 Major GC 。

出現(xiàn)了 Major GC,經常會伴隨至少一次的 Minor GC(但非絕對的,ParallelScavenge 收集器的收集策略里就有直接進行 Major GC 的策略選擇過程) 。MajorGC 的速度一般會比 Minor GC 慢 10倍以上。只不過在這個區(qū)域發(fā)生GC的條件非常嚴苛,必須符合以下三種條件才會被回收:

1.所有實例被回收

2.載該類的ClassLoader 被回收

3.Class 對象無法通過任何途徑訪問(包括反射)

 追問2:能說一下新生代空間的構成與執(zhí)行邏輯么?

新生代(Young generation)用來保存那些第一次被創(chuàng)建的對象,它被分成三個空間:

  • 一個伊甸園空間(Eden)
  • 兩個幸存者空間(From Survivor、To Survivor)

默認新生代空間的分配:Eden : From : To =8 : 1 : 1

在這里插入圖片描述

每個空間的執(zhí)行說明如下:

  • 絕大多數(shù)剛剛被創(chuàng)建的對象會存放在伊甸園空間(Eden)。當一個對象被判定為 死亡 的時候,GC 就有責任來回收掉這部分對象的內存空間。
  • 新生代是 GC 最頻繁區(qū)域。當對象在 Eden ( 包括一個 Survivor 區(qū)域,假設是 from 區(qū)域 ) 出生后,在經過一次 Minor GC后,如果對象還存活,并且能夠被另外一塊 Survivor 區(qū)域所容納(上面已經假設為 from 區(qū)域,這里應為 to 區(qū)域,即 to 區(qū)域有足夠的內存空間來存儲 Eden 和 from 區(qū)域中存活的對象 ),則使用復制算法將這些仍然還存活的對象復制到另外一塊 Survivor 區(qū)域 ( 即 to 區(qū)域 )中,然后清理所使用過的 Eden以及 Survivor 區(qū)域 ( 即from 區(qū)域 ),并且將這些對象的年齡設置為1。可見,兩個幸存者空間,必須有一個是保持空的。
  • 此后,對象在 Survivor 區(qū)每熬過一次 Minor GC,就將對象的年齡 + 1,當對象的年齡達到某個值時 ( 默認是 15 歲,可以通過參數(shù) -XX:MaxTenuringThreshold 來設定),這些對象就會成為老年代。
  • 但也有例外的,對于一些較大的對象 (即需要分配一塊較大的連續(xù)內存空間 ) 則是直接進入到老年代。。

如何判定對象死亡:通過引用計數(shù)法、可達性分析算法判斷是否還存在引用,以及結合根據對象引用強度判斷;

以下流程評論區(qū)朋友們有歧義,經查證確實是有問題的,保留下來引以為戒。

  • 絕大多數(shù)剛剛被創(chuàng)建的對象會存放在伊甸園空間(Eden)。
  • 在伊甸園空間執(zhí)行第一次GC(Minor GC)之后,存活的對象被移動到其中一個幸存者空間(Survivor)。
  • 此后,每次伊甸園空間執(zhí)行GC后,存活的對象會被堆積在同一個幸存者空間。
  • 當一個幸存者空間飽和,還在存活的對象會被移動到另一個幸存者空間。然后會清空已經飽和的哪個幸存者空間,可見,兩個幸存者空間,必須有一個是保持空的。
  • 在以上步驟中重復N次(N = MaxTenuringThreshold(年齡閥值設定,默認15))依然存活的對象,就會被移動到老年代。

當然,也有例外出現(xiàn),對于一些比較大的對象(需要分配一塊比較大的連續(xù)內存空間)則直接進入到老年代。一般在Survivor 空間不足的情況下發(fā)生。

追問3:說一下發(fā)生OOM時,垃圾回收機制的執(zhí)行流程。

1.對于一個很大的對象或數(shù)組,我們會首先在Eden 嘗試創(chuàng)建,如果Eden區(qū)內存不夠,創(chuàng)建不了,則觸發(fā)Minor GC;

2.Minor GC完成后繼續(xù)嘗試在Eden區(qū)存放,發(fā)現(xiàn)仍然放不下;

3.嘗試直接進入老年代,老年代也放不下

4.觸發(fā) FULL GC 清理老年代的空間

5.FULL GC完成后嘗試往老年代里放,還是放不下

6.OOM

面試題3:Full GC 、Major GC和 Minor GC有什么不同

我們見過很多 GC 名詞如:Minor GC、Young GC、Full GC、Old GC、Major GC、Mixed GC等。那么這么多GC如何進行大致區(qū)分?下面我們引用 R 大在知乎上的回答:

針對 HotSpot VM 的實現(xiàn),它里面的 GC 其實準確分類有兩種:

1.Partial GC(局部 GC): 并不收集整個 GC 堆的模式

  •  Young GC: 只收集 Young Gen 的 GC,Young GC 還有種說法就叫做 Minor GC,兩者是一個意思;
  • Old GC: 只收集 old gen 的 GC,只有垃圾收集器 CMS 的 concurrent collection 是這個模式;
  • Mixed GC: 收集整個 Young Gen 以及部分 old gen 的 GC,只有垃圾收集器 G1 有這個模式;

2.Full GC(全局 GC): 收集整個堆,包括新生代,老年代,永久代(在 JDK 1.8 及以后,永久代被移除,換為 metaspace 元空間)等所有部分的模式;

接下來讓我們再來了解下各個 GC:

(1)Minor GC / Young GC

首先我們先來看下 Minor GC / Young GC,大家都知道,新生代(Young Gen)也可以稱之為年輕代,這兩個名詞是等價的。那么在年輕代中的 Eden 內存區(qū)域被占滿之后,實際上就需要觸發(fā)年輕代的 GC,或者是新生代的 GC。

其實就是所謂的 Minor GC,也可以稱之為 Young GC。

(2)Old GC

所謂的老年代 GC,稱之為 Old GC 更加合適一些,因為從字面意義上就可以理解,這就是所謂的老年代 GC。

(3)Full GC

對于 Full GC,可以說 Full GC 指的是針對新生代、老年代、永久代的全體內存空間的垃圾回收,所以稱之為 Full GC。

(4)Major GC

上面我們提到,Major GC用于處理方法區(qū)的對象。這個區(qū)域不是用于存儲那些從老年代存活下來的對象,這個區(qū)域也可能發(fā)生GC,發(fā)生概率很低。

(5)Mixed GC

Mixed GC 是 G1 中特有的概念,其實說白了,主要就是說在 G1 中,一旦老年代占據堆內存的 45%(-XX:InitiatingHeapOccupancyPercent:設置觸發(fā)標記周期的 Java 堆占用率閾值,默認值是 45%。這里的Java 堆占比指的是 non_young_capacity_bytes,包括 old + humongous),就要觸發(fā) Mixed GC,此時對年輕代和老年代都會進行回收。Mixed GC 只有 G1 中才會出現(xiàn)。

總結

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關注腳本之家更多內容!

相關文章

  • java實現(xiàn)json字符串格式化處理的工具類

    java實現(xiàn)json字符串格式化處理的工具類

    這篇文章主要為大家詳細介紹了如何使用java實現(xiàn)json字符串格式化處理的工具類,文中的示例代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-01-01
  • Java使用elasticsearch基礎API使用案例講解

    Java使用elasticsearch基礎API使用案例講解

    這篇文章主要介紹了Java使用elasticsearch基礎API使用案例講解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-08-08
  • 淺談UUID生成的原理及優(yōu)缺點

    淺談UUID生成的原理及優(yōu)缺點

    UUID是一套用于生成全局唯一標識符的標準,也被稱為GUID?(Globally?Unique?Identifier),通過使用UUID可以在分布式系統(tǒng)中生成唯一的?ID,UUID的生成方式有多種,本文將詳細講解?UUID?的生成原理、特性、實用場景以及優(yōu)缺點
    2023-06-06
  • 淺談MyBatis執(zhí)行SQL的兩種方式

    淺談MyBatis執(zhí)行SQL的兩種方式

    本文介紹MyBatis執(zhí)行SQL語句的2種方式,主要是SqlSession和Mapper接口以及它們的區(qū)別,具有一定的參考價值,感興趣的可以了解一下
    2021-08-08
  • springboot使用@Validated或@Valid注解校驗參數(shù)方式

    springboot使用@Validated或@Valid注解校驗參數(shù)方式

    這篇文章主要介紹了springboot使用@Validated或@Valid注解校驗參數(shù)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Python__雙劃線參數(shù)代碼實例解析

    Python__雙劃線參數(shù)代碼實例解析

    這篇文章主要介紹了python__雙劃線參數(shù)代碼實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • Java人機猜拳實現(xiàn)的思路及方法實例

    Java人機猜拳實現(xiàn)的思路及方法實例

    這篇文章主要給大家介紹了關于Java人機猜拳實現(xiàn)的思路及方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • Eclipse+Java+Swing+Mysql實現(xiàn)電影購票系統(tǒng)(詳細代碼)

    Eclipse+Java+Swing+Mysql實現(xiàn)電影購票系統(tǒng)(詳細代碼)

    這篇文章主要介紹了Eclipse+Java+Swing+Mysql實現(xiàn)電影購票系統(tǒng)并附詳細的代碼詳解,需要的小伙伴可以參考一下
    2022-01-01
  • Spring詳解使用注解開發(fā)流程

    Spring詳解使用注解開發(fā)流程

    這篇文章主要為大家詳細介紹了Spring如何使用注解開發(fā),文中的示例代碼講解詳細,對我們學習或工作有一定幫助,需要的可以參考一下
    2022-05-05
  • Java 集合系列(二)ArrayList詳解

    Java 集合系列(二)ArrayList詳解

    這篇文章主要介紹了Java集合系列ArrayList,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03

最新評論