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

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

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務(wù)器之家 - 編程語言 - Java教程 - JVM進階教程之字段訪問優(yōu)化淺析

JVM進階教程之字段訪問優(yōu)化淺析

2021-06-28 10:24機智的小鳴 Java教程

這篇文章主要給大家介紹了關(guān)于JVM進階教程之字段訪問優(yōu)化的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

在實際中,java程序中的對象或許 本身就是逃逸 的,或許因為 方法內(nèi)聯(lián)不夠徹底 而被即時編譯器 當成是逃逸 的,這兩種情況都將

導致即時編譯器 無法進行標量替換 ,這時,針對對象字段訪問的優(yōu)化顯得更為重要。

?
1
2
3
4
static int bar(foo o, int x) {
 o.a = x;
 return o.a;
}
  1. 對象o是傳入?yún)?shù), 不屬于逃逸分析的范圍 (jvm中的逃逸分析針對的是 新建對象 )
  2. 該方法會將所傳入的int型參數(shù)x的值存儲至實例字段foo.a中,然后再讀取并返回同一字段的值
  3. 這段代碼涉及 兩次 內(nèi)存訪問操作:存儲和讀取實例字段foo.a
  4. 代碼可以手工優(yōu)化成如下
?
1
2
3
4
static int bar(foo o, int x) {
 o.a = x;
 return x;
}

即時編譯器也能作出類似的 自動優(yōu)化

字段讀取優(yōu)化

即時編譯器會優(yōu)化 實例字段 和 靜態(tài)字段 的訪問,以 減少總的內(nèi)存訪問次數(shù)

即時編譯器將 沿著控制流 ,緩存各個字段 存儲節(jié)點 將要存儲的值,或者字段 讀取節(jié)點 所得到的值

  • 當即時編譯器 遇到對同一字段的讀取節(jié)點 時,如果緩存值還沒有失效,那么將讀取節(jié)點 替換 為該緩存值
  • 當即時編譯器 遇到對同一字段的存儲節(jié)點 時,會 更新 所緩存的值
    • 當即時編譯器遇到 可能更新 字段的節(jié)點時,它會采取 保守 的策略, 舍棄所有的緩存值
    • 方法調(diào)用節(jié)點 :在即時編譯器看來,方法調(diào)用會執(zhí)行 未知代碼
    • 內(nèi)存屏障節(jié)點 :其他線程可能異步更新了字段

樣例1

?
1
2
3
4
static int bar(foo o, int x) {
 int y = o.a + x;
 return o.a + y;
}

實例字段foo.a被讀取兩次,即時編譯器會將第一次讀取的值緩存起來,并且 替換 第二次的字段讀取操作,以 節(jié)省 一次內(nèi)存訪問

?
1
2
3
4
5
static int bar(foo o, int x) {
 int t = o.a;
 int y = t + x;
 return t + y;
}

樣例2

?
1
2
3
4
5
6
7
static int bar(foo o, int x) {
 o.a = 1;
 if (o.a >= 0)
  return x;
 else
  return -x;
}

字段讀取節(jié)點被替換成一個 常量 ,進一步觸發(fā)更多的優(yōu)化

?
1
2
3
4
static int bar(foo o, int x) {
 o.a = 1;
 return x;
}

樣例3

?
1
2
3
4
5
6
7
8
class foo {
 boolean a;
 void bar() {
  a = true;
  while (a) {}
 }
 void whatever() { a = false; }
}

即時編譯器會將while循環(huán)中讀取實例字段a的操作 直接替換為常量true

?
1
2
3
4
5
6
7
8
void bar() {
 a = true;
 while (true) {}
}
// 生成的機器碼將陷入這一死循環(huán)中
0x066b: mov r11,qword ptr [r15+0x70] // 安全點測試
0x066f: test dword ptr [r11],eax  // 安全點測試
0x0672: jmp 0x066b     // while (true)

1、可以通過 volatile 關(guān)鍵字標記實例字段a,以 強制 對a的讀取

2、實際上,即時編譯器將 在volatile字段訪問前后插入內(nèi)存屏障節(jié)點

  • 這些 內(nèi)存屏障節(jié)點 將 阻止 即時編譯器 將屏障之前所緩存的值用于屏障之后的讀取節(jié)點之上
  • 在x86_64平臺上,volatile字段讀取前后的內(nèi)存屏障都是no-op
    • 在 即時編譯過程中的屏障節(jié)點 ,還是會 阻止即時編譯器的字段讀取優(yōu)化
    • 強制在循環(huán)中使用 內(nèi)存讀取指令 訪問實例字段foo.a的最新值

3、同理, 加解鎖操作同樣也會阻止即時編譯器的字段讀取優(yōu)化

字段存儲優(yōu)化

如果一個字段先后被存儲了兩次,而且這 兩次存儲之間沒有對第一次存儲內(nèi)容讀取 ,那么即時編譯器將 消除 第一個字段存儲

樣例1

?
1
2
3
4
5
6
7
class foo {
 int a = 0;
 void bar() {
  a = 1;
  a = 2;
 }
}

即時編譯器將消除bar方法的冗余存儲

?
1
2
3
void bar() {
 a = 2;
}

樣例2

即便在某個字段的兩個存儲操作之間讀取該字段,即時編譯器也可能在 字段讀取優(yōu)化 的幫助下,將第一個存儲操作當作 冗余存儲

場景:例如兩個存儲操作之間隔著許多代碼,又或者因為 方法內(nèi)聯(lián) 的原因,將兩個存儲操作納入到同一編譯單元里(如構(gòu)造器中字段的初始化以及隨后的更新)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class foo {
 int a = 0;
 void bar() {
  a = 1;
  int t = a;
  a = t + 2;
 }
}
// 優(yōu)化為
class foo {
 int a = 0;
 void bar() {
  a = 1;
  int t = 1;
  a = t + 2;
 }
}
// 進一步優(yōu)化為
class foo {
 int a = 0;
 void bar() {
  a = 3;
 }
}

如果所存儲的字段被標記為 volatile ,那么即時編譯器也 不能消除冗余存儲

死代碼消除

樣例1

?
1
2
3
4
5
int bar(int x, int y) {
 int t = x*y;
 t = x+y;
 return t;
}

沒有節(jié)點依賴于t的第一個值 x*y ,因此該乘法運算將被消除

?
1
2
3
int bar(int x, int y) {
 return x+y;
}

樣例2

?
1
2
3
4
5
6
int bar(boolean f, int x, int y) {
 int t = x*y;
 if (f)
  t = x+y;
 return t;
}

部分程序路徑上有冗余存儲(f=true),該路徑上的乘法運算將會被消除

?
1
2
3
4
5
6
7
8
int bar(boolean f, int x, int y) {
 int t;
 if (f)
  t = x+y;
 else
  t = x*y;
 return t;
}

樣例3

?
1
2
3
4
5
6
int bar(int x) {
 if (false)
  return x;
 else
  return -x;
}

不可達分支指的是任何程序路徑都不可達到的分支,即時編譯器將 消除不可達分支

?
1
2
3
int bar(int x) {
 return -x;
}

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務(wù)器之家的支持。

原文鏈接:http://zhongmingmao.me/2019/01/06/jvm-advanced-optimization-filed-access/

延伸 · 閱讀

精彩推薦
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
主站蜘蛛池模板: 成人影院在线观看 | 91视频在线免费观看 | 国产精品一区二 | 国产精品亚洲精品 | 欧美精品 | 国产欧美日韩综合精品一区二区 | 国产精品一区二区久久久 | 日韩和的一区二在线 | 天天看天天操 | 波多野结衣福利电影 | 91精品国产乱码久久久久久 | 亚洲四区 | 综合二区| 亚洲h | 国产一区二区三区久久 | www.久久| 久久中文字幕在线观看 | 狠狠爱网站 | 91se在线| 日本 欧美 国产 | 一区二区蜜桃 | 日本一区二区免费视频 | 波多野结衣一二三四区 | 久久综合另类激情人妖 | 日韩欧美在线一区二区 | 成人动慢 | 欧美在线观看一区 | 国产在线视频网站 | 亚洲成人播放器 | 国产aⅴ| 玖玖操| 日韩av免费在线观看 | 亚洲美腿 欧美 激情 另类 | 日本不卡一区二区三区 | 欧美三级在线 | av片在线观看 | 亚洲一区二区三区视频 | 亚洲第一区在线 | 黄色地址 | 精品一区亚洲 | 99精品国产一区二区三区 |