java - 为什么Java对象指向指针?
问题描述
JVMS说:
在 Oracle 的一些 Java 虚拟机实现中,对类实例的引用是指向句柄的指针,句柄本身就是一对指针:一个指向包含对象方法的表,另一个指向代表对象的类型,另一个是从堆中为对象数据分配的内存。
我不明白为什么引用会以这种方式实现,而不是使它们成为指向方法表指针的指针,后跟对象的数据。这将避免对象创建时的额外内存分配和字段访问时额外的指针取消引用。
甲骨文这样实施它们的原因是什么?
解决方案
这种策略将允许在内存中移动对象,而无需调整所有现有引用,因为只需要调整一个直接指针。移动内存中的对象将通过复制或压缩垃圾收集器来完成。
然而,对于所有最近的 JVM 实现,这种间接的成本被认为不值得节省,因此“一些 Oracle 的实现”实际上是指“Oracle 在购买 Sun 时从 Sun 获得的一些非常旧的 JVM”。当今现实世界的 JVM 在内存中移动对象时会调整所有引用。
换句话说,这是一个关于仍在使用的 JVM 的过时声明,但作为替代实施策略的示例保留在规范中。
推荐阅读
- java - 使用 Junit5 在 Spring Boot 应用程序中测试服务层时如何避免数据库连接
- typescript - 如何使用 as 类型修复接口语法错误?
- html - 为什么 xpath 在使用 `not` 时不选择具有空类的元素?
- nativescript - nativescript-ui-sidedrawer - 在 iOS 中加载问题:TypeError:无法加载视图:NativeRadSideDrawer
- node.js - 猫鼬填充方法不起作用是否有其他方法可以从另一个集合中获取数据?
- r - R中按比例的稀有标签编码
- java - 如何为准备探测配置 hazelcast IMDG
- python-3.x - 无法将 pandas 数据帧转换为 Tensorflow 2 数据集
- ruby-on-rails - rails,将参数从控制器传递到服务
- python - 为什么 sys.argv 在 Python 中退出时设置为 None?