作者回复: 赞!
作者回复: invokedynamic涉及到的东西很多,底层实现也在不断改进。看懂个大概就好啦
作者回复: 逃逸分析是指通过数据流分析,判断一个对象会不会被传递到当前编译的方法之外。比如说你调用了一个方法,将一个新建的对象作为参数传递出去,如果这个方法没有被内联,则说明该新建对象会逃逸。
逃逸分析是一项比较重要的优化,我后面会详细讲。
作者回复: 语言里的final,是对于当前方法调用而言的。这是因为它实际上就传了个值进去。比如说你定义了int a,然后传入 i -> i +a里,那么之后你对a的修改lambda是看不到的。
适配器针对的是多次不同调用,比如说每次调用你定义的final int a都不一样。
作者回复: 1. 这个数字0,指的是第几个bootstrap method,你多定义几个lambda,应该可以见到1 2 3等等。
2. 对的,是不能内联。不过,字节码中字段处还是会有final标志的。C2认为final实例字段在编译过程中不应该被认为是不变的,因为应用程序可能通过Unsafe来更改。Graal认为可以当成不变的,毕竟Java语言规范没有规定不可以。
V11的话,可以看出ConstantCallsite及时子类被特殊对待了。
作者回复: 主要是了解底层实现。
对普通的日常开发可能作用不大。对于进阶的,比如分析应用的性能瓶颈,了解字节码将有所帮助。
作者回复: 多谢指出!