无效对象所有字段的有效方式

时间:2019-03-29 19:04:25

标签: java performance

我有一个简单的pojo类,其中包含20多个字段和对性能敏感的代码。为了减少分配,我重用了该类的相同实例。 如何以最有效(不安全)的方式清理对象?

如果我不误认为字段数据将存储为连续的字节序列,那么我希望某些数据的速度必须与System.arraycopy一样快。

该类本身是稳定API的一部分,而不是要修改的主题。

3 个答案:

答案 0 :(得分:1)

调用20个简单的二传手是很便宜的操作。只需要几纳秒。我很确定这不是值得优化的东西。

以一种直接的方式逐个设置字段已经足够优化。从理论上讲,使用SIMD指令可以更快地清除对象,但是用Java无法实现。

有一种方法Unsafe.setMemory,但它仅适用于原始数组。这种局限性已广为人知:通过批量操作清除带有参考字段的对象是无效的,因为不同的GC可能需要分别跟踪对参考字段的更新。

如果您查看Arrays.fill的实现,它使用一个简单的循环来逐个存储元素,由于上述原因,该方法甚至不是JVM固有的。

答案 1 :(得分:0)

正如已经提到的,其背后的原因值得高度质疑。

我们不想使用反射,因为众所周知反射很慢。您是否考虑使用Java字节码操作库(Javassist,Bytebuddy等),该库允许您修改Pojo类并添加其他方法,该方法会将所有字段直接设置为 null

答案 2 :(得分:0)

假设您要始终一次使所有字段无效,那么最简单的方法是拥有一个内部对象,其中包含所有值。让您的吸气剂和吸气剂成为该对象周围的光包装。然后,无需使用单独的字段来使字段无效,只需使用一个新的实例刷新内部对象,该实例的字段开始为null。