国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

一次有趣的局部變量GC

alogy / 3007人閱讀

摘要:前言最近在看實戰虛擬機發現書上的一個關于局部變量表挺有意思,先上代碼。主角沒有分配了一塊的堆空間,并使用局部變量引用這塊空間然后顯式進行一次。

前言

最近在看《實戰Java虛擬機》, 發現書上的一個關于局部變量表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的堆空間,并使用局部變量引用這塊空間, 然后顯式進行一次Full GC。

先配置一下JVM參數用于打印GC log

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

可以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的空間已經被回收了,僅僅因為多了一句看似與a毫無關系的 int c = 0;

答案

借助jclasslib工具我們進一步查看函數的局部變量信息, 在此之前我們需要對代碼做一點小改動再進行分析

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即時編譯器擁有死代碼消除的特性,a數組并沒有被任何地方使用,即時編譯器可以精簡數據流,并且減少編譯時間以及最終生成機器碼的大小。簡單的說如果a沒有被使用的話會被編譯成var0, 我們在本地變量表中看不到a了。

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

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

總結

通過這個GC的小例子,切實感受到了JVM對于資源節省的嚴苛程度,對于作用域的細粒度把控之強大。給大家推薦我讀的這本《實戰Java虛擬機》,切實的一本好書,所謂好書無非兩點:1.能讀懂 2.有所獲。同時也推薦極客時間的《深入拆解虛擬機》,多路學習,兼聽則明。

最后打個小廣告~

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/71928.html

相關文章

  • JVM解剖公園

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

    imingyu 評論0 收藏0
  • JAVA GC垃圾回收(及一次內存泄漏處理)

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

    RaoMeng 評論0 收藏0
  • 對象

    摘要:入隊列,即表示當前對象已回收。時,清空對象的屬性即執行,再將對象加入該對象關聯的中。當一個被掉之后,其相應的包裝類對象會被放入中。原因是編譯程序實現上的困難內部類對象的生命周期會超過局部變量的生命期。 一個類的靜態成員在類的實例gc后,不會銷毀。 對象引用強度 強引用Strong Reference 就是指在代碼之中普遍存在的,類似:Object objectRef = new Obe...

    nanfeiyan 評論0 收藏0

發表評論

0條評論

alogy

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<