成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

一次有趣的局部變量GC

alogy / 3001人閱讀

摘要:前言最近在看實(shí)戰(zhàn)虛擬機(jī)發(fā)現(xiàn)書上的一個(gè)關(guān)于局部變量表挺有意思,先上代碼。主角沒有分配了一塊的堆空間,并使用局部變量引用這塊空間然后顯式進(jìn)行一次。

前言

最近在看《實(shí)戰(zhàn)Java虛擬機(jī)》, 發(fā)現(xiàn)書上的一個(gè)關(guān)于局部變量表GC挺有意思,先上代碼。

主角 沒有GC
public class Main {
    public static void reversion(){
        {
            byte[] a = new byte[6*1024*1024];
        }
        System.gc();
    }

    public static void main(String[] args) {
        reversion();
    }
}

分配了一塊6MB的堆空間,并使用局部變量引用這塊空間, 然后顯式進(jìn)行一次Full GC。

先配置一下JVM參數(shù)用于打印GC log

可以看到這塊6MB的堆空間并沒有被回收, 接下來(lái)加一行代碼就能使得堆空間被回收。

可以GC
public class Main {
    public static void reversion(){
        {
            byte[] a = new byte[6*1024*1024];
        }
        int c = 0;
        System.gc();
    }

    public static void main(String[] args) {
        reversion();
    }
}

可以看到這6MB的空間已經(jīng)被回收了,僅僅因?yàn)槎嗔艘痪淇此婆ca毫無(wú)關(guān)系的 int c = 0;

答案

借助jclasslib工具我們進(jìn)一步查看函數(shù)的局部變量信息, 在此之前我們需要對(duì)代碼做一點(diǎn)小改動(dòng)再進(jìn)行分析

public class Main {
    public static void reversion(){
        {
            byte[] a = new byte[6*1024*1024];
            System.out.println(a[0]);
        }
        int c = 0;
        System.gc();
    }

    public static void main(String[] args) {
        reversion();
    }
}

tips:JVM即時(shí)編譯器擁有死代碼消除的特性,a數(shù)組并沒有被任何地方使用,即時(shí)編譯器可以精簡(jiǎn)數(shù)據(jù)流,并且減少編譯時(shí)間以及最終生成機(jī)器碼的大小。簡(jiǎn)單的說如果a沒有被使用的話會(huì)被編譯成var0, 我們?cè)诒镜刈兞勘碇锌床坏絘了。

可以看到a和c在局部變量表中的索引值都是0,也就是說c重用了a在局部變量表中的槽位,從而使得a指向的堆空間能夠被GC回收

棧幀中的局部變量表中的槽位是可以重用的,如果一個(gè)局部變量過了其作用域,那么在其作用域之后申明的新的局部變量就很有可能復(fù)用過期局部變量的槽位,從而達(dá)到節(jié)省資源的目的

總結(jié)

通過這個(gè)GC的小例子,切實(shí)感受到了JVM對(duì)于資源節(jié)省的嚴(yán)苛程度,對(duì)于作用域的細(xì)粒度把控之強(qiáng)大。給大家推薦我讀的這本《實(shí)戰(zhàn)Java虛擬機(jī)》,切實(shí)的一本好書,所謂好書無(wú)非兩點(diǎn):1.能讀懂 2.有所獲。同時(shí)也推薦極客時(shí)間的《深入拆解虛擬機(jī)》,多路學(xué)習(xí),兼聽則明。

最后打個(gè)小廣告~

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/71928.html

相關(guān)文章

  • JVM解剖公園

    摘要:為此,引入轉(zhuǎn)換查找緩沖緩存最近的轉(zhuǎn)換記錄。這個(gè)優(yōu)化技術(shù),可以看到將原本對(duì)對(duì)象的字段訪問,替換為一個(gè)局部變量的訪問。當(dāng)所有線程都在已知的位置停止的時(shí)候,被認(rèn)為是到達(dá)了安全點(diǎn)。檢查安全點(diǎn)請(qǐng)求的代碼 showImg(https://segmentfault.com/img/bVbwfcz?w=1024&h=576); 1、JVM鎖粗化和循環(huán)原文標(biāo)題:JVM Anatomy Quark #1:...

    imingyu 評(píng)論0 收藏0
  • JAVA GC垃圾回收(及一次內(nèi)存泄漏處理)

    摘要:垃圾回收及一次內(nèi)存泄漏處理內(nèi)存分布上圖展示了的架構(gòu)圖,本篇我們主要關(guān)注,運(yùn)行時(shí)數(shù)據(jù)區(qū)。但是垃圾回收并不能百分百保證不會(huì)出現(xiàn)內(nèi)存泄漏,所以了解垃圾回收,對(duì)于我們遇到內(nèi)存泄漏時(shí)能更加清晰的分析原因,也能幫助我們寫出更加安全,可靠的程序。 [toc] JAVA GC垃圾回收(及一次內(nèi)存泄漏處理) showImg(https://segmentfault.com/img/remote/1460...

    RaoMeng 評(píng)論0 收藏0
  • 對(duì)象

    摘要:入隊(duì)列,即表示當(dāng)前對(duì)象已回收。時(shí),清空對(duì)象的屬性即執(zhí)行,再將對(duì)象加入該對(duì)象關(guān)聯(lián)的中。當(dāng)一個(gè)被掉之后,其相應(yīng)的包裝類對(duì)象會(huì)被放入中。原因是編譯程序?qū)崿F(xiàn)上的困難內(nèi)部類對(duì)象的生命周期會(huì)超過局部變量的生命期。 一個(gè)類的靜態(tài)成員在類的實(shí)例gc后,不會(huì)銷毀。 對(duì)象引用強(qiáng)度 強(qiáng)引用Strong Reference 就是指在代碼之中普遍存在的,類似:Object objectRef = new Obe...

    nanfeiyan 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<