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

JVM詳解之匯編角度理解本地變量的生命周期

 更新時間:2020年07月29日 09:49:21   投稿:mrr  
這篇文章主要介紹了JVM詳解之匯編角度理解本地變量的生命周期,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

簡介

java方法中定義的變量,它的生命周期是什么樣的呢?是不是一定要等到方法結(jié)束,這個創(chuàng)建的對象才會被回收呢?

帶著這個問題我們來看一下今天的這篇文章。

本地變量的生命周期

在類中,變量類型有類變量,成員變量和本地變量。

本地變量指的是定義在方法中的變量,如果我們在方法中定義了一個變量,那么這個變量的生命周期是怎么樣的呢?

舉個例子:

public void test(){
  Object object = new Object();
  doSomeThingElse(){
    ...
  }
}

在上面的test方法中,定義了一個object本地變量,然后又執(zhí)行了一個方法。

因為在java中,我們無法直接控制對象的生命周期,對象的回收是由垃圾回收器自動進行的。

通常來說這個object對象會維持到整個test執(zhí)行結(jié)束才會被回收。

現(xiàn)在我們考慮一個特殊的情況,如果doSomeThingElse這個方法是一個while循環(huán),并且永遠不會結(jié)束,那么這個創(chuàng)建出來的object對象會不會被回收呢?還是一直都存在內(nèi)存中?

先說我們的結(jié)論,JVM非常智能,可以檢測出來這種情況,將object對象進行回收。

舉例說明

為了能夠更好的說明問題,我們自定義一個Test對象,并在其創(chuàng)建和被回收之前打印相應(yīng)的信息。

public static class Test {
    public Test() {
      System.out.println("創(chuàng)建對象 " + this);
    }

    public void test() {
      System.out.println("測試對象 " + this);
    }

    @Override
    protected void finalize() throws Throwable {
      System.out.println("回收對象 " + this);
    }
  }

然后做兩個測試,第一個測試沒有無限循環(huán),第二個測試保持無限循環(huán),循環(huán)通過一個volatile變量flag來控制:

public static void main(String[] args) throws InterruptedException {
    System.out.println("開始測試1");
    resetFlag();
    flag = true;
    testLocalVariable();

    System.out.println("等待Test1結(jié)束");
    Thread.sleep(10000);

    System.out.println("開始測試2");
    flag = true;
    testLocalVariable();
  }

看一下testLocalVariable方法的定義:

public static void testLocalVariable() {
    Test test1 = new Test();
    Test test2 = new Test();
    while (flag) {
      // 啥都不做
    }
    test1.test();
  }

然后我們再啟動一個線程做定時的GC。好了一切就緒,我們運行吧:

開始測試1
創(chuàng)建對象 com.flydean.LocalVariableReachability$Test@119d7047
創(chuàng)建對象 com.flydean.LocalVariableReachability$Test@776ec8df
回收對象 com.flydean.LocalVariableReachability$Test@776ec8df
測試對象 com.flydean.LocalVariableReachability$Test@119d7047
等待Test1結(jié)束
回收對象 com.flydean.LocalVariableReachability$Test@119d7047

開始測試2
創(chuàng)建對象 com.flydean.LocalVariableReachability$Test@4eec7777
創(chuàng)建對象 com.flydean.LocalVariableReachability$Test@3b07d329
回收對象 com.flydean.LocalVariableReachability$Test@3b07d329

先看測試1的結(jié)果,我們可以看到第二個對象在調(diào)用test1.test()之前就被回收了。

再看測試2的結(jié)果,我們可以看到第二個對象同樣被回收了。

結(jié)果說明了JVM是足夠智能的,可以自行優(yōu)化本地變量的生命周期。

優(yōu)化的原因

我們考慮一下,JVM是在什么階段對本地變量的生命周期進行優(yōu)化的呢?

很明顯,這個優(yōu)化不是在編譯期間進行的,而是在運行期中進行的優(yōu)化。

我們使用-XX:+PrintAssembly分析一下匯編代碼:

首先說明,本人的匯編語言還是很多年前學過的,如果解釋起來有錯誤的地方,請多多指正。

先說兩個概念rbx和r10都是64位CPU的寄存器,r10d是r10的低32位。

先看紅框1, 紅框1表示rbx中保存的是我們定義的LocalVariableReachability類中的一個Test對象。

再看紅框2,紅框2表示r10現(xiàn)在保存的是LocalVariableReachability這個類實例。

紅框3表示的是進入while循環(huán)的時候,ImutableOopMap中存儲的對象,大家可以看到里面只有r10和rbx,也就是說只有類實例和其中的一個Test實例。

紅框4是什么呢?紅框4表示的是一個safe point,也就是垃圾回收的時候的安全點。在這個安全點上如果有不再被使用的對象就會被回收。

因為ImutableOopMap中只存有兩個對象,那么剩下的一個Test實例就會被回收。

到此這篇關(guān)于JVM詳解之匯編角度理解本地變量的生命周期的文章就介紹到這了,更多相關(guān)JVM匯編角度理解本地變量的生命周期內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring boot注解@Async線程池實例詳解

    Spring boot注解@Async線程池實例詳解

    這篇文章主要介紹了Spring boot注解@Async線程池實例詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • Java中使用Java?Mail實現(xiàn)郵件服務(wù)功能示例

    Java中使用Java?Mail實現(xiàn)郵件服務(wù)功能示例

    這篇文章主要介紹了Java中使用Java?Mail實現(xiàn)郵件服務(wù)功能的相關(guān)資料,文章還提供了一個發(fā)送郵件的示例代碼,包括創(chuàng)建參數(shù)類、郵件類和執(zhí)行結(jié)果,需要的朋友可以參考下
    2025-01-01
  • Java實現(xiàn)的兩種常見簡單查找算法示例【快速查找與二分查找】

    Java實現(xiàn)的兩種常見簡單查找算法示例【快速查找與二分查找】

    這篇文章主要介紹了Java實現(xiàn)的兩種常見簡單查找算法,結(jié)合具體實例形式分析了java快速查找與二分查找的原理與簡單實現(xiàn)技巧,需要的朋友可以參考下
    2017-09-09
  • StringUtils,CollectionUtils判斷為空的方法和原生代碼哪個效率最高

    StringUtils,CollectionUtils判斷為空的方法和原生代碼哪個效率最高

    這篇文章主要介紹了StringUtils,CollectionUtils判斷為空的方法和原生代碼哪個效率最高,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Servlet中配置和使用過濾器的步驟記錄

    Servlet中配置和使用過濾器的步驟記錄

    這篇文章主要介紹了在Servlet中配置和使用過濾器的方法,包括創(chuàng)建過濾器類、配置過濾器以及在Web應(yīng)用中使用過濾器等步驟,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-01-01
  • Spring(一):IOC如何推導和理解

    Spring(一):IOC如何推導和理解

    下面小編就為大家?guī)硪黄斦凷pring對IOC的理解(推薦篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-07-07
  • Spring?Boot中@Validated注解不生效問題匯總大全

    Spring?Boot中@Validated注解不生效問題匯總大全

    這篇文章主要給大家介紹了關(guān)于Spring?Boot中@Validated注解不生效問題匯總的相關(guān)資料,@Validated注解是Spring框架中的一個注解,用于在方法參數(shù)上添加參數(shù)校驗規(guī)則,需要的朋友可以參考下
    2023-07-07
  • 聊聊Java并發(fā)中的Synchronized

    聊聊Java并發(fā)中的Synchronized

    這篇文章主要介紹了聊聊Java并發(fā)中的Synchronized,介紹了同步的基礎(chǔ),原理,鎖的相關(guān)內(nèi)容,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • Java中回調(diào)函數(shù)?(callback)?及其實際應(yīng)用場景

    Java中回調(diào)函數(shù)?(callback)?及其實際應(yīng)用場景

    在Java中回調(diào)函數(shù)(Callback)是一種常見的設(shè)計模式,用于實現(xiàn)異步操作或事件處理,這篇文章主要給大家介紹了關(guān)于Java中回調(diào)函數(shù)?(callback)?及其實際應(yīng)用場景的相關(guān)資料,需要的朋友可以參考下
    2024-02-02
  • 詳解Java繼承中屬性、方法和對象的關(guān)系

    詳解Java繼承中屬性、方法和對象的關(guān)系

    這篇文章主要幫助大家詳細介紹了Java繼承中屬性、方法和對象的關(guān)系,感興趣的朋友可以參考一下
    2016-03-03

最新評論

开江县| 扎赉特旗| 微博| 苍梧县| 正安县| 湖南省| 买车| 渝北区| 凤城市| 察隅县| 宿迁市| 于田县| 眉山市| 拜泉县| 平泉县| 崇州市| 长泰县| 克东县| 乡城县| 凤阳县| 礼泉县| 革吉县| 祁阳县| 罗城| 孟州市| 新晃| 鹰潭市| 周至县| 赣榆县| 象州县| 凉山| 将乐县| 台中县| 石嘴山市| 湖南省| 平凉市| 保靖县| 武胜县| 南宫市| 宝山区| 贵溪市|