激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

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

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

服務器之家 - 編程語言 - Java教程 - JVM進階教程之字段訪問優化淺析

JVM進階教程之字段訪問優化淺析

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

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

前言

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

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

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

即時編譯器也能作出類似的 自動優化

字段讀取優化

即時編譯器會優化 實例字段 和 靜態字段 的訪問,以 減少總的內存訪問次數

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

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

樣例1

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

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

?
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;
}

字段讀取節點被替換成一個 常量 ,進一步觸發更多的優化

?
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循環中讀取實例字段a的操作 直接替換為常量true

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

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

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

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

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

字段存儲優化

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

樣例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

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

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

?
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;
 }
}
// 優化為
class foo {
 int a = 0;
 void bar() {
  a = 1;
  int t = 1;
  a = t + 2;
 }
}
// 進一步優化為
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;
}

沒有節點依賴于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;
}

總結

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 免费a视频 | 成人毛片100免费观看 | 欧美亚洲国产一区二区三区 | 激情久久免费视频 | 小视频免费在线观看 | 一色视频| 国产精品久久久久久久午夜片 | 日本在线播放一区二区 | 国av在线| 久久99亚洲精品 | 12av毛片| 国产美女视频黄a视频免费 日韩黄色在线播放 | 欧美日本亚洲视频 | 亚洲日韩中文字幕一区 | 一级α片免费看刺激高潮视频 | 午夜精品影院 | 国产精品久久久久久久久粉嫩 | 日本www黄色 | 最近免费观看高清韩国日本大全 | 精品亚洲一区二区 | 国产精品久久国产精麻豆96堂 | 国产成人精品无人区一区 | 久久sp| 国产成人精品一区在线播放 | 大学生一级毛片在线视频 | 91精品国产91久久久久久不卞 | 久久久久久久久免费 | 国产精品免费成人 | 一级毛片在线观看免费 | 欧美日韩在线中文字幕 | 91短视频版高清在线观看www | 久国产 | 国产亚洲综合精品 | 亚洲人成电影在线 | 无码专区aaaaaa免费视频 | 成人免费看片a | 广州毛片 | 日本特级a一片免费观看 | 性大片性大片免费 | 免费观看一区二区三区 | 欧美精品成人一区二区在线观看 |