•  素丶  
    2018-11-07
    https://zhuanlan.zhihu.com/p/26389041
    https://zhuanlan.zhihu.com/p/30936412
    可以和 Shijie 大大的两篇文章配合着看。

    作者回复: 赞!

     1
     10
  • karl
    2018-08-14
    看了两遍 勉强有个概念了
    还是基础不够 看不懂啊

    作者回复: invokedynamic涉及到的东西很多,底层实现也在不断改进。看懂个大概就好啦

    
     9
  • code-artist
    2018-08-14
    一直没理解“逃逸分析”啥意思?

    作者回复: 逃逸分析是指通过数据流分析,判断一个对象会不会被传递到当前编译的方法之外。比如说你调用了一个方法,将一个新建的对象作为参数传递出去,如果这个方法没有被内联,则说明该新建对象会逃逸。

    逃逸分析是一项比较重要的优化,我后面会详细讲。

    
     7
  • ext4
    2018-08-11
    我知道Java对Lambda有个规定:“The variable used in Lambda should be final or effectively final",也就是说Lambda表达式捕获的变量必须是final或等同于final的。而文中您又讲到:“对于捕获了变量的Lambda,每次invokedynamic都需要新建适配器类实例,以防止他们发生变化”。JVM之所以这么做,是因为这种final的要求仅限于Java source层面,在bytecode层面是是无法保证的。我理解的对吗?

    作者回复: 语言里的final,是对于当前方法调用而言的。这是因为它实际上就传了个值进去。比如说你定义了int a,然后传入 i -> i +a里,那么之后你对a的修改lambda是看不到的。

    适配器针对的是多次不同调用,比如说每次调用你定义的final int a都不一样。

    
     7
  • 微笑
    2019-02-17
    如果该 Lambda 表达式捕获了其他变量,那么每次执行该 invokedynamic 指令,我们都要更新这些捕获了的变化。
    问题:捕获的变量必须是final,为什么还会变呢,为什么会线程不安全呢?
    
     3
  • 小鳄鱼
    2018-11-15
    老师,看来上一篇和这篇,又两个问题:
    1. 尽管逃逸分析能够去除这些额外的新建实例开销,但是它也不是时时奏效。那么什么情况下不奏效呢?
    2. 什么情况下编译器会将句柄识别成常量?除了本文中将MethodHandler定义为常量外,在其他什么情况下能识别为常量呢
     1
     2
  • Scott
    2018-08-19
    老师你好,我有两个问题,1是我看了几个有invokedynmaic指令的文件,都是invokedynamic #31, 0这种形式,似乎后面这个0没有什么作用,网上invokedynamic的解说也大多过时,我使用的是1.8.0_181版本。2. v10版本和v11版本性能的差距我猜想是v10版本不能正确的内联方法吧?虽然mh是final的,但是字节码层面已经丢失这个信息了。

    作者回复: 1. 这个数字0,指的是第几个bootstrap method,你多定义几个lambda,应该可以见到1 2 3等等。

    2. 对的,是不能内联。不过,字节码中字段处还是会有final标志的。C2认为final实例字段在编译过程中不应该被认为是不变的,因为应用程序可能通过Unsafe来更改。Graal认为可以当成不变的,毕竟Java语言规范没有规定不可以。

    V11的话,可以看出ConstantCallsite及时子类被特殊对待了。

    
     1
  • 脸皮
    2019-12-13
    invokedynamic是用来支持动态类型语言的,而不是把java语言变成动态类型语言,只是在java语言的方法调用上做了改进,以前是将方法分派固化在虚拟机上,现在可以动态的确定目标方法。不知道我说得对不对?还望大神指点一下
    
    
  • KW💤
    2019-07-09
    我想问下MonomorphicInlineCache这个例子,为什么能说“调用点方法句柄类型匹配”?
    "invoke"的methodType是MethodType.methodType(void.class, Object.class)
    “race”的methodType是 MethodType.methodType(void.class)。
    还有callsite的用处是什么,我感觉只是将MethodHandle包了一层返回而已,为什么要多这一层
    
    
  • 夕林语
    2019-04-17
    v10和v11的区别仅仅是v11的内部类继承了ConstantCallSite,ConstantCallSite是不可被更改链接的调用点,是不是说明v11的内部类被内联了?从而可以达到和直接调用近似的执行效率
    
    
  • 小橙橙
    2018-08-19
    其实有个地方一直没有想透,为什么要学习字节码,学习字节码对我们日常开发有什么作用吗,老师能否给指点迷津一下?

    作者回复: 主要是了解底层实现。

    对普通的日常开发可能作用不大。对于进阶的,比如分析应用的性能瓶颈,了解字节码将有所帮助。

    
    
  • Void_seT
    2018-08-11
    单态内联缓存的实现代码段,bootstrap方法的实现有问题,没有return一个CallSite类型返回值。另外,这篇有点难度了,看了三遍,勉强理解。

    作者回复: 多谢指出!

    
    
  • 小江
    2018-08-10
    老师邮箱可以提供一下吗,咨询一个问题,经过btrace增强后class文件错误问题
    
    
  • 自来也
    2018-08-10
    示例应该用jdk.internal.org.objectweb.asm.*包吧?
    
    
我们在线,来聊聊吧