最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

面試題2:JVM會在什么時候進(jìn)行GC呢?

JVM常在以下幾種場景時進(jìn)行GC操作:

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

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

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

新生代(Young generation):

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

老年代(Old generation):

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

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

持久代(Permanent generation):

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

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

1.所有實例被回收

2.載該類的ClassLoader 被回收

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

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

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

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

默認(rèn)新生代空間的分配:Eden : From : To =8 : 1 : 1

在這里插入圖片描述

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

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

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

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

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

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

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

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

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

3.嘗試直接進(jìn)入老年代,老年代也放不下

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如何進(jìn)行大致區(qū)分?下面我們引用 R 大在知乎上的回答:

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

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 內(nèi)存區(qū)域被占滿之后,實際上就需要觸發(fā)年輕代的 GC,或者是新生代的 GC。

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

(2)Old GC

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

(3)Full GC

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

(4)Major GC

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

(5)Mixed GC

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

總結(jié)

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

相關(guān)文章

  • Java中HashMap里面key為null存放到哪

    Java中HashMap里面key為null存放到哪

    這篇文章主要介紹了Java中HashMap里面key為null存放到哪,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Java如何根據(jù)根據(jù)IP地址獲取省市

    Java如何根據(jù)根據(jù)IP地址獲取省市

    這篇文章主要為大家詳細(xì)介紹了兩種在Java中獲取IP地址對應(yīng)地理位置信息的方法,分別是使用ip2region庫和GeoIP庫,感興趣的小伙伴可以了解下
    2025-01-01
  • 面試必時必問的JVM 類加載機制詳解

    面試必時必問的JVM 類加載機制詳解

    這篇文章主要介紹了一文讀懂Jvm類加載機制,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2021-08-08
  • Java中大數(shù)據(jù)推薦算法使用場景分析

    Java中大數(shù)據(jù)推薦算法使用場景分析

    在Java中實現(xiàn)大數(shù)據(jù)推薦算法時,通常會使用一些開源的機器學(xué)習(xí)庫,如Apache Mahout、Weka、DL4J(DeepLearning4j,用于深度學(xué)習(xí))或者Spark MLlib(用于在Spark集群上運行),這篇文章主要介紹了Java中可以用的大數(shù)據(jù)推薦算法,需要的朋友可以參考下
    2024-06-06
  • SpringBoot超詳細(xì)講解多數(shù)據(jù)源集成

    SpringBoot超詳細(xì)講解多數(shù)據(jù)源集成

    今天分享下SpringBoot多數(shù)據(jù)源集成,我怕麻煩,這里我覺得我的集成也應(yīng)該是最簡單的,清晰明了
    2022-05-05
  • java集成開發(fā)SpringBoot生成接口文檔示例實現(xiàn)

    java集成開發(fā)SpringBoot生成接口文檔示例實現(xiàn)

    這篇文章主要為大家介紹了java集成開發(fā)SpringBoot如何生成接口文檔的示例實現(xiàn)過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10
  • Java9新特性中的模塊化詳解

    Java9新特性中的模塊化詳解

    今天介紹一個Java?9的功能,模塊化(Modular),這可能使Java有史以來最大的Feature,對Java9模塊化相關(guān)知識感興趣的朋友一起看看吧
    2022-03-03
  • 如何使用MAVEN打JAR包(直接使用)

    如何使用MAVEN打JAR包(直接使用)

    這篇文章主要介紹了如何使用MAVEN打JAR包(直接使用),文中通過實例代碼介紹了maven?使用assembly插件進(jìn)行打包的方法,需要的朋友可以參考下
    2023-03-03
  • 理解JPA注解@GeneratedValue的使用方法

    理解JPA注解@GeneratedValue的使用方法

    這篇文章主要介紹了理解JPA注解@GeneratedValue的使用方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • Java中new關(guān)鍵字和newInstance方法的區(qū)別分享

    Java中new關(guān)鍵字和newInstance方法的區(qū)別分享

    在初始化一個類,生成一個實例的時候,newInstance()方法和new關(guān)鍵字除了一個是方法一個是關(guān)鍵字外,最主要的區(qū)別是創(chuàng)建對象的方式不同
    2013-07-07

最新評論

灵武市| 禹城市| 札达县| 遵义县| 建水县| 凌源市| 遂川县| 海林市| SHOW| 灵山县| 锦屏县| 大余县| 聂拉木县| 岳阳市| 天水市| 酒泉市| 锡林浩特市| 渑池县| 苏尼特左旗| 长沙县| 金山区| 鹤峰县| 绥棱县| 威远县| 沅江市| 松滋市| 潜江市| 徐州市| 新晃| 化德县| 文安县| 绍兴县| 西昌市| 东乡族自治县| 庆云县| 闸北区| 南木林县| 潞城市| 南丹县| 黄大仙区| 京山县|