国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - JVM詳解之匯編角度理解本地變量的生命周期

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

2020-07-29 14:03mrr Java教程

這篇文章主要介紹了JVM詳解之匯編角度理解本地變量的生命周期,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

簡介

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

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

本地變量的生命周期

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

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

舉個例子:

?
1
2
3
4
5
6
public void test(){
  Object object = new Object();
  doSomeThingElse(){
    ...
  }
}

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

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

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

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

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

舉例說明

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static class Test {
    public Test() {
      System.out.println("創建對象 " + this);
    }
 
    public void test() {
      System.out.println("測試對象 " + this);
    }
 
    @Override
    protected void finalize() throws Throwable {
      System.out.println("回收對象 " + this);
    }
  }

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
public static void main(String[] args) throws InterruptedException {
    System.out.println("開始測試1");
    resetFlag();
    flag = true;
    testLocalVariable();
 
    System.out.println("等待Test1結束");
    Thread.sleep(10000);
 
    System.out.println("開始測試2");
    flag = true;
    testLocalVariable();
  }

看一下testLocalVariable方法的定義:

?
1
2
3
4
5
6
7
8
public static void testLocalVariable() {
    Test test1 = new Test();
    Test test2 = new Test();
    while (flag) {
      // 啥都不做
    }
    test1.test();
  }

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

開始測試1
創建對象 com.flydean.LocalVariableReachability$Test@119d7047
創建對象 com.flydean.LocalVariableReachability$Test@776ec8df
回收對象 com.flydean.LocalVariableReachability$Test@776ec8df
測試對象 com.flydean.LocalVariableReachability$Test@119d7047
等待Test1結束
回收對象 com.flydean.LocalVariableReachability$Test@119d7047

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

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

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

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

優化的原因

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

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

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

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

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

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

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

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

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

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

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

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

原文鏈接:https://segmentfault.com/a/1190000023414030

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 成人小视频在线观看 | 福利国产 | 中文字幕人成乱码在线观看 | 国产综合久久 | 久久精品二区 | 国产在线一区二区三区 | 男女视频网站 | 一区二区高清 | 午夜精品久久久久久 | 成人在线观看免费视频 | 中文精品在线 | 精品一区二区三区免费毛片 | 欧美日韩免费在线 | 99爱精品在线| 国产亚洲成av人片在线观看桃 | 91在线看黄| 在线观看国产精品一区 | 毛片在线视频 | 国产精品亚洲综合 | 黄色成人在线视频 | 嫩草视频免费在线观看 | 亚洲久久一区二区 | 亚洲国产高清在线播放 | 羞羞视频在线免费观看 | 久久精品国产一区二区三区 | 亚洲免费看片 | 亚洲视频中文字幕 | www,四虎 | 亚洲理论电影在线观看 | 精品www| 探花在线观看 | 免费激情网站 | 久久久一区二区精品 | 亚洲视频在线一区 | 国产精品欧美一区二区三区 | 色婷婷综合网 | 国产成人精品亚洲日本在线观看 | 日韩视频免费在线播放 | a国产精品 | 超碰精品在线 | 日韩欧美一区二区三区免费观看 |