我有一个简单的 pojo 类,包含 20 多个字段和性能敏感的代码段。为了减少分配,我重用了该类的同一实例。 如何以最高效(不安全)的方式清理对象?
如果我没有误解字段数据存储为连续的字节序列,那么我希望一定有像 System.arraycopy
一样快的东西。
类本身是稳定 API 的一部分,不可修改。
请您参考如下方法:
调用 20 个简单的 setter 是一个廉价的操作。只需要几纳秒。我很确定这不是值得优化的东西。
直接一一设置字段就已经足够优化了。理论上,使用 SIMD 指令可以更快地清除对象,但在 Java 中无法做到这一点。
有一个方法Unsafe.setMemory
,但它仅适用于原始数组。这种限制是很容易理解的:通过批量操作清除具有引用字段的对象是无效的,因为不同的 GC 可能需要单独跟踪引用字段的更新。
如果你看Arrays.fill
实现中,它使用一个简单的循环来逐个存储元素,并且由于上述原因,该方法甚至不是 JVM 固有的。