java 数组优化_Java数组的jit优化问题?

题主的问题描述有点简单,这边先根据问题评论和题主在自己的回答里给出的补充内容描述一下题主想问的东西是什么。

题主想问的是JVM对对象的布局的优化问题。这个不只涉及JIT,还涉及JVM里的其它子系统,例如类的元布局、对象布局的计算、GC等。

给出的例子是,对于类似这样的输入:

import java.util.concurrent.ThreadLocalRandom;

public class AAAA {

private final boolean multi;

private final Object[] obj;

public AAAA(boolean multi) {

this.multi = multi;

if (multi) { // multi is false in 99% of the cases at runtime obj = new Object[100];

// initialize objs } else {

obj = new Object[] { new Object() };

}

}

public Object getObject() {

if (multi) return obj[ThreadLocalRandom.current().nextInt(100)];

else return obj[0];

}

}

JVM是否可以将其优化为类似下面的形式:

public class AAAA {

private final boolean multi;

private final Object innerObj;

public AAAA(boolean multi) {

this.multi = multi;

if (multi) { // multi is false in 99% of the cases at runtime deoptimize();

} else {

innerObj = new Object();

}

}

public Object getObject() {

if (multi) deoptimize();

else return innerObj;

}

}

简短回答:就当前主流的几个JVM实现(Oracle JDK / OpenJDK HotSpot VM、IBM J9 VM、Zing VM等)的现状看,不能。

就代码上来说,JIT编译单独把AAAA类的构造器里冷的路径编译为 deoptimize() / uncommon_trap() 让它回解释器里跑,这种事情是现在就做得到而且很常见的。但是要调整对象布局,抛弃掉一层封装,把一个数组类型的字段抛弃掉换成把里面的唯一元素提升到直接作为一个字段,这种优化是当前的JVM并没有实现的。

理论上说这样的优化也不是没有可能。例如说这篇论文就讨论了动态改变对象布局的可能性以及一种实现:http://ssw.jku.at/Research/Papers/Wimmer08PhD/Wimmer08PhD.pdf 。只是当前的主流JVM实现尚未实现这样的优化而已。

对目前的主流实现来说,阻碍对这种场景做优化的主要因素是:例子中的multi是个实例字段而不是一个静态字段,它的值在整个系统里并不是单一的,而可能是有很多的——每个实例会各自携带不同的值,要依赖这样的每个实例动态的值反馈来做类型层面上的优化会比较麻烦。

而且有个小细节:Java里的数组并没有“所有元素都是final的数组”这么一种东西,一个 final Object[] array 只能表达“array”这个引用不可变——array不能指向别的数组实例,但是array所指向的数组里的元素还是可以任意改变。所以它自身就隐含着一层额外的可变性,这语义可不是那么好优化的。给题主看一个这种可变性的一种用法:为什么Java闭包不能通过返回值之外的方式向外传递值? - RednaxelaFX的回答 - 知乎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值