java - invokevirtual 是否会破坏 Java 上的标量替换?
问题描述
我希望重构我的应用程序以允许转义分析和标量替换为一个特定的对象启动,该对象经常被分配。
我假设我不会在 JVM 中达到任何内联限制,因为我可以在需要时进行调整(完全内联是 Scalar Replacement 工作的需要之一)
假设一个基本的代码流程是这样的:
public class DataHandler {
// IHandler is an interface of which there are 4 different implementations at runtime
private IHandler handler; // child handler - implementation
public void handleData(SomeData data) {
HeavyObjectIWantToScalarReplace obj = new HeavyObjectIWantToScalarReplace(data);
handler.handle(obj)
}
}
使用对象调用虚拟方法是否足以破坏最新 OpenJDK 或 OpenJ9 的标量替换?如果是这样,可以使用哪种解决方案最接近当前的 OOP 方法,同时避免调用虚拟?
也许 invokevirtual 可以通过 JIT 进行优化,并且足以确保这 4 个处理程序类中没有一个“泄漏”对 HeavyObjectIWantToScalarReplace 的引用?
解决方案
推荐阅读
- python-3.x - How to create a simple user log-in
- algorithm - 为什么这个算法的时间复杂度是 O(n^5)?
- python-3.5 - get_or_create 和 update_or_create 在同时执行时保存值不止一次
- c# - 如何为 Unity 中的任何类型类字段实现 OnValueChange
- firebase - Firestore 标记数据模型最佳实践(数组与字典)
- pandas - 使用日期时间索引切片数据获取 emty 数据框
- android - 在 ViewPager 中暂停的片段不接收 LiveData 事件
- css - 为什么 Boostrap 4.4.1 媒体查询不起作用?
- python - 未找到添加到 virtualenv 'activate' 脚本的环境变量(mac)
- javascript - InfiniteCalendar 中 onSelect 的事件处理程序