简介

上一篇文章我们讲解了Virtual Call的定义并举例分析了Virtual Call在父类和子类中的优化。

JIT对类可以进行优化,那么对于interface可不可以做同样的优化么?

一起来看看吧。

最常用的接口List

List应该是大家最最常用的接口了,我想这个大家应该不会反驳。

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

今天我们就拿List来做例子,体验一下JIT优化接口的奥秘。

还是上代码,要分析的代码如下:

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.flydean.com");
}
}

如果在命令行运行,大家记得在运行时添加参数-XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:-Inline

直接看JIT Watcher的结果:

我们可以看到JIT中先对ArrayList的实现类做了一个比较。

然后调用的是invokeinterface,但是其本质还是invokevirtual,并且我们可以看到这个调用是被优化过了:optimized virtual call。

多个List的调用

同样的,我们可以测试一下多个list子类的情况下怎么调用:

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.flydean.com");
}
}

同样,使用JIT Watcher来运行:

我们可以看到JIT做了两次对象类型的比较,然后对两个invokeinterface都做了优化。

结果和我们的父类子类结果是一样的。

不一样的List调用

上面我们在做多个list调用的时候,是轮循着来调用的,如果我们先调用ArrayList的方法,再调用LinkedList的方法,会有什么不同呢?

一起来看看。

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.flydean.com");
}
}

上面我们先循环ArrayList,然后再循环LinkedList。

看下结果有什么不同:

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

也就是说LinkedList的调用是没有进行代码优化的。

上面的结果是在C2编译器下,也就是level4的编译水平下解析的。

我们看下如果在C1编译器下,也就是Level3编译水平下有什么不同。

可以看到C1编译下,所有的invokeinterface都没有进行编译优化,只有在C2编译下,才会进行优化。

不同的JVM版本可能优化方式不一样。大家可以自行实验。

总结

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

感兴趣的朋友,可以一起讨论。

本文作者:flydean程序那些事

本文链接:http://www.flydean.com/jvm-virtual-call-interface/

本文来源:flydean的博客

欢迎关注我的公众号:程序那些事,更多精彩等着您!

JVM系列之:JIT中的Virtual Call接口的更多相关文章

  1. JVM系列之:JIT中的Virtual Call

    目录 简介 Virtual Call和它的本质 Virtual Call和classic call Virtual Call优化单实现方法的例子 Virtual Call优化多实现方法的例子 总结 简 ...

  2. 小师妹学JVM之:JIT中的PrintCompilation

    目录 简介 PrintCompilation 分析PrintCompilation的结果 总结 简介 上篇文章我们讲到了JIT中的LogCompilation,将编译的日志都收集起来,存到日志文件里面 ...

  3. 小师妹学JVM之:JIT中的PrintAssembly

    目录 简介 使用PrintAssembly 输出过滤 总结 简介 想不想了解JVM最最底层的运行机制?想不想从本质上理解java代码的执行过程?想不想对你的代码进行进一步的优化和性能提升? 如果你的回 ...

  4. JVM系列五:JVM监测&工具

    JVM系列五:JVM监测&工具[整理中]  http://www.cnblogs.com/redcreen/archive/2011/05/09/2040977.html 前几篇篇文章介绍了介 ...

  5. jvm系列(八):jvm知识点总览-高级Java工程师面试必备

    在江湖中要练就绝世武功必须内外兼备,精妙的招式和深厚的内功,武功的基础是内功.对于武功低(就像江南七怪)的人,招式更重要,因为他们不能靠内功直接去伤人,只能靠招式,利刃上优势来取胜了,但是练到高手之后 ...

  6. jvm系列(四):jvm知识点总结

    原文链接:http://www.cnblogs.com/ityouknow/p/6482464.html jvm 总体梳理 jvm体系总体分四大块: 类的加载机制 jvm内存结构 GC算法 垃圾回收 ...

  7. jvm系列四、jvm知识点总结

    原文链接:http://www.cnblogs.com/ityouknow/p/6482464.html jvm 总体梳理 jvm体系总体分四大块: 类的加载机制 jvm内存结构 GC算法 垃圾回收 ...

  8. jvm系列(八):jvm知识点总览

    在江湖中要练就绝世武功必须内外兼备,精妙的招式和深厚的内功,武功的基础是内功.对于武功低(就像江南七怪)的人,招式更重要,因为他们不能靠内功直接去伤人,只能靠招式,利刃上优势来取胜了,但是练到高手之后 ...

  9. JVM系列文章(四):类载入机制

    作为一个程序猿,只知道怎么用是远远不够的. 起码,你须要知道为什么能够这么用.即我们所谓底层的东西. 那究竟什么是底层呢?我认为这不能一概而论.以我如今的知识水平而言:对于Web开发人员,TCP/IP ...

随机推荐

  1. Windows Socket编程精华《TCP通信服务器》

    1.网络中进程之间如何通信? 首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的.其实TCP/IP协议族已经帮我们解决了这个问 ...

  2. 汉王JAVA笔试题

    汉王JAVA笔试题 1,jsp中动态include与静态include的区别? (1)动态包含总是会检查文件中的变化,适合用于包含动态页面,并且可以带参数. (2)静态包含不会检查所含文件的变化,适用 ...

  3. 蕴含式(包含EXISTS语句的分析)

    *{ font-family: STFangSong; outline: none; } 蕴含式 一.蕴含式基础 (Ⅰ)什么是"蕴含式" 设p.q为两个命题.复合命题"如 ...

  4. python 生成器(一):生成器基础(一)生成器函数

    前言 实现相同功能,但却符合 Python 习惯的方式是,用生成器函数代替SentenceIterator 类.示例 14-5 sentence_gen.py:使用生成器函数实现 Sentence 类 ...

  5. hihoCoder 1050 树中的最长路 最详细的解题报告

    题目来源:树中的最长路 解题思路:枚举每一个点作为转折点t,求出以t为根节点的子树中的‘最长路’以及与‘最长路’不重合的‘次长路’,用这两条路的长度之和去更新答案,最终的答案就是这棵树的最长路长度.只 ...

  6. day3 python数据类型转换及变量的缓存机制

    类型转换 1,强制类型转换 1.1 number的转换(int,float,bool,complex) num1 = 10 num2 = 10.6 num3 = True num4 = 3 + 4j ...

  7. 详解UDP协议

    运输层位于网络层之上,网络层提供了主机之间的逻辑通信:而运输层为运行在不同主机上的应用进程之间提供了逻辑通信.从应用程序角度看,通过逻辑通信,运行不同进程的主机好像直接相连一样.应用进程使用运输层提供 ...

  8. IOS上传图片方向问题

    在显示上传完毕的图片的时候遇到了一个问题, 图片莫名其妙被逆时针旋转了90度就很离谱 如下图 经过一番查询, 原来是 IOS 的相机拍照的时候会把方向角写入到图片里面 因为我用的是 element 的 ...

  9. 获取字符串指定字符的第n次出现位置

    create function uf_findx (@text nvarchar(max),@find_x varchar(200),@find_n int)returns intasbegin -- ...

  10. 数字孪生,数据驱动下的北京 CBD 智能楼宇三维可视化系统

    前言 楼宇作为建筑基础设施的主体,为人们提供着重要的生存空间.随着物联网.人工智能概念的兴起以及智慧城市如火如荼的开展,智能楼宇的重要性越发突显. 随着城市现代化建设的发展,建筑的智能化,特别是公用建 ...