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

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

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

服務器之家 - 編程語言 - Java教程 - JVM系列之:JIT中的Virtual Call接口操作

JVM系列之:JIT中的Virtual Call接口操作

2020-09-15 01:14flydean程序那些事 Java教程

這篇文章主要介紹了JVM系列之:JIT中的Virtual Call接口操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

簡介

上一篇文章我們講解了Virtual Call的定義并舉例分析了Virtual Call在父類和子類中的優化。

JIT對類可以進行優化,那么對于interface可不可以做同樣的優化么?

一起來看看吧。

最常用的接口List

List應該是大家最最常用的接口了,我想這個大家應該不會反駁。

public interface List<E> extends Collection<E> {

今天我們就拿List來做例子,體驗一下JIT優化接口的奧秘。

還是上代碼,要分析的代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class TestVirtualListCall {
 
  public static void main(String[] args) throws InterruptedException {
    List<String> list=new ArrayList<>();
    for (int i = 0; i < 10000; i++)
    {
      doWithVMethod(list);
    }
    Thread.sleep(1000);
  }
 
  public static void doWithVMethod(List<String> list)
  {
    list.add("www.jfrwli.cn");
  }
}

如果在命令行運行,大家記得在運行時添加參數-XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:-Inline

直接看JIT Watcher的結果:

JVM系列之:JIT中的Virtual Call接口操作

我們可以看到JIT中先對ArrayList的實現類做了一個比較。

然后調用的是invokeinterface,但是其本質還是invokevirtual,并且我們可以看到這個調用是被優化過了:optimized virtual call。

多個List的調用

同樣的,我們可以測試一下多個list子類的情況下怎么調用:

JVM系列之:JIT中的Virtual Call接口操作

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class TestVirtualListCall2 {
 
  public static void main(String[] args) throws InterruptedException {
    List<String>[] lists=new List[]{new ArrayList<>(),new LinkedList<>()};
    for (int i = 0; i < 10000; i++)
    {
      doWithVMethod(lists[i%2]);
    }
    Thread.sleep(1000);
  }
 
  public static void doWithVMethod(List<String> list)
  {
    list.add("www.jfrwli.cn");
  }
}

同樣,使用JIT Watcher來運行:

我們可以看到JIT做了兩次對象類型的比較,然后對兩個invokeinterface都做了優化。

結果和我們的父類子類結果是一樣的。

不一樣的List調用

上面我們在做多個list調用的時候,是輪循著來調用的,如果我們先調用ArrayList的方法,再調用LinkedList的方法,會有什么不同呢?

一起來看看。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class TestVirtualListCall3 {
 
  public static void main(String[] args) throws InterruptedException {
    List<String> list1 = new ArrayList<>();
    List<String> list2 = new LinkedList<>();
    for (int i = 0; i < 10000; i++)
    {
      doWithVMethod(list1);
    }
    Thread.sleep(1000);
    for (int i = 0; i < 10000; i++)
    {
      doWithVMethod(list2);
    }
    Thread.sleep(1000);
  }
 
  public static void doWithVMethod(List<String> list)
  {
    list.add("www.jfrwli.cn");
  }
}

上面我們先循環ArrayList,然后再循環LinkedList。

看下結果有什么不同:

JVM系列之:JIT中的Virtual Call接口操作

可以看到,JIT先比較了ArrayList,然后只做了一次方法的優化。

也就是說LinkedList的調用是沒有進行代碼優化的。

上面的結果是在C2編譯器下,也就是level4的編譯水平下解析的。

我們看下如果在C1編譯器下,也就是Level3編譯水平下有什么不同。

JVM系列之:JIT中的Virtual Call接口操作

可以看到C1編譯下,所有的invokeinterface都沒有進行編譯優化,只有在C2編譯下,才會進行優化。

不同的JVM版本可能優化方式不一樣。大家可以自行實驗。

總結

本文用實例展示了Virtual Call在interface上面的優化使用。

感興趣的朋友,可以一起討論。

補充知識:Java 8 Stream 流已被操作或關閉

在Java 8中,Stream不能重復使用,一旦被消耗或使用,流將被關閉,類似流水線,水龍頭的水一樣一去不復返

示例 - 流關閉

查看以下示例,它會拋出一個IllegalStateException,表示“流被關閉”。

TestJava8.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.mkyong.java8;
import java.util.Arrays;
import java.util.stream.Stream;
public class TestJava8 {
  public static void main(String[] args) {
    String[] array = {"a", "b", "c", "d", "e"};
    Stream<String> stream = Arrays.stream(array);
    // loop a stream
    stream.forEach(x -> System.out.println(x));
    // reuse it to filter again! throws IllegalStateException
    long count = stream.filter(x -> "b".equals(x)).count();
    System.out.println(count);
  }
}

Output

?
1
2
3
4
5
6
7
8
9
10
11
12
java.lang.IllegalStateException: stream has already been operated upon or closed
 at java.util.stream.AbstractPipeline.(AbstractPipeline.java:203)
 at java.util.stream.ReferencePipeline.(ReferencePipeline.java:94)
 at java.util.stream.ReferencePipeline$StatelessOp.(ReferencePipeline.java:618)
 at java.util.stream.ReferencePipeline$2.(ReferencePipeline.java:163)
 at java.util.stream.ReferencePipeline.filter(ReferencePipeline.java:162)
 at com.hostingcompass.whois.range.run.TestJava8.main(TestJava8.java:25)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at java.lang.reflect.Method.invoke(Method.java:498)
 at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

示例 - 重用流

TestJava8.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.mkyong.java8;
import java.util.function.Supplier;
import java.util.stream.Stream;
 public class TestJava8 {
 
  public static void main(String[] args) {
    String[] array = {"a", "b", "c", "d", "e"};
     Supplier<Stream<String>> streamSupplier = () -> Stream.of(array);
 
    //get new stream
    streamSupplier.get().forEach(x -> System.out.println(x));
 
    //get another new stream
    long count = streamSupplier.get().filter(x -> "b".equals(x)).count();
    System.out.println(count);
  }
 }

Output

a

b

c

d

e

1

每個get()都會返回一個新的流

以上這篇JVM系列之:JIT中的Virtual Call接口操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/superfjj/article/details/107778750

延伸 · 閱讀

精彩推薦
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
主站蜘蛛池模板: av成人免费在线观看 | 国产黄色一级大片 | 久久久久久亚洲精品中文字幕 | 国产精品99久久久久久动医院 | 日韩成人免费 | 午夜区| 亚洲在线一区二区 | 一区二区三区在线免费视频 | 成人在线一区二区 | 精品福利网站 | 日韩av一区二区在线观看 | 欧美麻豆| 香蕉久久一区二区不卡无毒影院 | 福利视频1000 | 欧美激情精品久久久久久黑人 | 农村末发育av片四区五区 | 国产xxxx成人精品免费视频频 | 成人片网址 | 国产亚洲精品一区二区 | 国产a自拍 | 中文久久久久久 | 中文字幕在线永久在线视频 | 日本免费在线 | 欧美国产精品一区二区 | av久久 | 欧美一区二区三区不卡 | 国产不卡精品视频 | 国产精品中文字幕在线观看 | 在线看片你懂得 | 久久9国产偷伦 | 午夜在线小视频 | 欧美日韩成人一区二区 | 亚洲成人免费网站 | 精品久久久久久亚洲精品 | 亚洲福利一区 | 国产成人精品一区二区在线 | 亚洲精品一区 | 啪啪导航 | 婷婷五月色综合 | 免费观看日本视频 | 亚洲视频免费看 |