<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Java面試題之JDK

          共 2409字,需瀏覽 5分鐘

           ·

          2021-05-10 00:50

          一,JVM內(nèi)存模型

          根據(jù)JVM的規(guī)范,JVM內(nèi)存共分為虛擬機(jī)棧,本地方法棧,堆,方法區(qū),程序計(jì)數(shù)器五個(gè)部分。


          線程私有:

          程序計(jì)數(shù)器:是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器,每條線程都有一個(gè)獨(dú)立的程序計(jì)數(shù)器,這類內(nèi)存也稱為“線程私有”的內(nèi)存。正在執(zhí)行Java方法的話,計(jì)數(shù)器記錄的是虛擬機(jī)字節(jié)碼指令的地址(當(dāng)前指令的地址)。如果是Natice方法(指一個(gè)Java調(diào)用非Java代碼的接口0,則是空。

          虛擬機(jī)棧:每個(gè)方法在執(zhí)行的時(shí)候也會(huì)創(chuàng)建一個(gè)棧幀,存儲(chǔ)了局部變量,操作數(shù),動(dòng)態(tài)鏈接,方法返回地址。每個(gè)方法從調(diào)用到執(zhí)行完畢,對(duì)應(yīng)一個(gè)棧幀在虛擬機(jī)棧中的入棧和出棧。通常所說的棧,一般是指在虛擬機(jī)棧中的局部變量部分。局部變量所需內(nèi)存在編譯期間完成分配,如果線程請求的棧深度大于虛擬機(jī)所允許的深度,則StackOverflowError。如果虛擬機(jī)??梢詣?dòng)態(tài)擴(kuò)展,擴(kuò)展到無法申請足夠的內(nèi)存,則OutOfMemoryError。

          本地方法棧:和虛擬機(jī)棧類似,主要為虛擬機(jī)使用到的Native方法(指一個(gè)Java調(diào)用非Java代碼的接口)服務(wù)。也會(huì)拋出StackOverflowError

          線程共享:

          堆:被所有線程共享的一塊內(nèi)存區(qū)域,在虛擬機(jī)啟動(dòng)的時(shí)候創(chuàng)建,用于存放對(duì)象實(shí)例。對(duì)可以按照可擴(kuò)展實(shí)現(xiàn)(通過-Xmx和-Xms來控制)當(dāng)隊(duì)中沒有內(nèi)存可分配給實(shí)例,也無法再擴(kuò)展時(shí),則拋出OutOfMemoryError異常。

          方法區(qū):被所有方法棧共享的一塊內(nèi)存區(qū)域。用于存儲(chǔ)已經(jīng)被虛擬機(jī)加載的類信息,常量,靜態(tài)變量等。這個(gè)區(qū)域的內(nèi)存回收目標(biāo)主要針對(duì)常量池的回收和堆類型的卸載。

          二,方法區(qū)JDK1.6至JDK1.7值JDK1.8的變化。

          第一段代碼,判斷JDK1.6與JDK1.7和JDK1.8的區(qū)別:



          解答:假如在JDK1.8或者JDK1.7的環(huán)境下運(yùn)行,答案是true。但是在JDK1.6環(huán)境下,返回結(jié)果是false。

          原因:字符串常量一般放在常量池(Constant Pool)中,但是在JDK1.6環(huán)境下,常量池放在永久代(PermGen)中,在執(zhí)行str2.intern()之前,String str2 = new String(“test”) + new String(“01”);通過生成了多個(gè)對(duì)象,str2最終指向Java堆內(nèi)存中的“test01”的引用地址。在執(zhí)行str2.intern()時(shí),因?yàn)槌A砍刂袥]有“test01”這個(gè)字符串,會(huì)在常量池中生成該字符串的拷貝,將此字符串常量添加到常量池中。在進(jìn)行String str1 = “test01”字面量賦值的時(shí)候,常量池中已經(jīng)存在該字符串常量,就直接返回了該字符串常量在永久代中的引用地址,因此當(dāng)調(diào)用str2==str1的時(shí)候,**用Java堆內(nèi)存中的引用地址和永久代中的引用地址進(jìn)行比較,一定返回false。**那JDK1.7和JDK1.8的返回結(jié)果為true,是不是說他們倆str2和str1指向的是同一個(gè)內(nèi)存的引用地址呢?答案確實(shí)是這樣。
          從JDK1.6到JDK1.7,HotSpot虛擬機(jī),關(guān)于永久代中的內(nèi)存分配模型發(fā)生了變化,其中一部分就體現(xiàn)在永久代中常量池的變化,
          JDK1.7之后將字符串常量池從永久代(PermGen)中移動(dòng)到Java堆內(nèi)存中了。

          第二段代碼JDK1.7和JDK1.8之間的區(qū)別:


          JDK1.7的運(yùn)行結(jié)果:


          JDK1.8的運(yùn)行結(jié)果:


          在JDK1.6環(huán)境下,拋出OutOfMemoryError:PermGen space,永久代空間不足。

          在JDK1.7和JDK1.8環(huán)境下,拋出OutOfMemoryError:Java heap space,堆空間不足。

          通過上面的報(bào)錯(cuò)信息也正好印證了咱們上面說的將常量池由永久代移動(dòng)到了Java堆內(nèi)存中。但是通過比對(duì)JDK1.7和JDk1.8的報(bào)錯(cuò)信息咱們也可以看到,相比于JDK1.7,上圖中JDK1.8的報(bào)錯(cuò)信息中多出了一部分紅色的警告信息。Ignoring option PermSize/MaxPermSize= XXM;support was removerd in 8.0;意思就是,忽略這兩個(gè)參數(shù),這兩個(gè)參數(shù)已經(jīng)被刪除了。

          這是因?yàn)閺腏DK1.8之后,永久代(PermGen)被完全地移除了,所以永久代的參數(shù)-XX:PermSize和-XX:MaxPermSize也被移除了。
          對(duì)于JDK1.8, HotSpots取消了永久代,那么是不是也就沒有方法區(qū)了呢?當(dāng)然不是,方法區(qū)是一個(gè)規(guī)范,規(guī)范沒變,它就一直在,只不過取代永久代的是元空間(Metaspace)而已。

          在原來的永久代劃分中,永久代用來存放類的元數(shù)據(jù)信息、靜態(tài)常量以及常量池等?,F(xiàn)在類的元信息存儲(chǔ)在元空間中,靜態(tài)變量和常量池等并入堆中,相當(dāng)于原來的永久代中的數(shù)據(jù),被元空間和堆內(nèi)存給瓜分了。

          相比于之前的永久代劃分,Oracle為什么要做這樣的改進(jìn)呢?

          在原來的永久代劃分中,每當(dāng)一個(gè)類初次被加載的時(shí)候,它的元數(shù)據(jù)都會(huì)放到永久代中。但是永久代的內(nèi)存空間也是有大小限制的,如果加載的類太多,很有可能導(dǎo)致永久代內(nèi)存溢出;同時(shí),永久代大小也不容易確定,因?yàn)檫@其中有很多影響因素,比如類的總數(shù),常量池的大小和方法數(shù)量等,但是PermSize指定太小又很容易造成永久代內(nèi)存溢出;同時(shí),HotSpot虛擬機(jī)的每種類型的垃圾回收器都需要特殊處理永久代中的元數(shù)據(jù)。永久代會(huì)為GC帶來不必要的復(fù)雜度,并且回收效率偏低。將元數(shù)據(jù)從永久代剝離出來,不僅實(shí)現(xiàn)了對(duì)元空間的無縫管理,還可以簡化Full GC以及對(duì)以后的并發(fā)隔離類元數(shù)據(jù)等方面進(jìn)
          行優(yōu)化。


          瀏覽 29
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  黄色日本视频 | 色综合高清在线观看视频 | 深爱网婷婷丁香五月丁香综合网 | 免费视频播放一区二区 | 成人精品一区二区区别解析 |