Java 取消对象的所有字段的有效方法

Java 取消对象的所有字段的有效方法,java,performance,Java,Performance,我有一个简单的pojo类,包含20多个字段和一段对性能敏感的代码。为了减少分配,我重用了类的同一个实例。 如何以最有效(不安全)的方式清理对象 如果我没有弄错的话,字段数据是以连续的字节序列存储的,所以我希望一定有像System.arraycopy一样快的东西 类本身是稳定API的一部分,不需要修改。如前所述,其背后的推理是非常值得怀疑的 我们不想使用反射,因为我们知道反射非常慢。您是否考虑使用java字节码操作库(javAsple,ByTeByDy,…),它允许您修改POJO类,并添加一个将所

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

如果我没有弄错的话,字段数据是以连续的字节序列存储的,所以我希望一定有像
System.arraycopy
一样快的东西


类本身是稳定API的一部分,不需要修改。

如前所述,其背后的推理是非常值得怀疑的


我们不想使用反射,因为我们知道反射非常慢。您是否考虑使用java字节码操作库(javAsple,ByTeByDy,…),它允许您修改POJO类,并添加一个将所有字段直接设置为null的附加方法。那么最简单的方法就是拥有一个包含所有值的内部对象。让您的getter和setter成为该对象字段的轻包装器。然后,不必单独为字段设置空值,只需使用字段以空值开头的新实例刷新内部对象即可。

调用20个简单setter是一种廉价的操作。它只需要几纳秒。我很确定这不是一件值得优化的事情

以简单的方式逐个设置字段已经足够优化了。从理论上讲,使用SIMD指令可以更快地清除对象,但在Java中无法做到这一点

有一种方法
不安全。setMemory
,但它仅适用于基本数组。这一限制很容易理解:通过批量操作清除带有引用字段的对象是无效的,因为不同的GC可能需要单独跟踪引用字段的更新


如果您看一下实现,它使用一个简单的循环来逐个存储元素,并且由于上述原因,该方法甚至不是JVM本质。

我想让垃圾收集器完成它的工作。您是否使用过探查器&您确定这是必要的吗。最有效的方法可能是不走这么长的路,分配一个新的对象,而不是重用旧的对象。@dustytrash我问我们的架构师同样的问题,答案是“是的”。调用20个简单的setter是一个便宜的操作。它只需要几纳秒。“我很确定这不是一件值得优化的事情。”apangin我写了一个jmh基准测试。你完全正确。谢谢。我已经有了修改字段的setter。所以不需要字节码黑客。但是需要20多个方法调用才能使所有字段无效。不幸的是,这相当于只创建一个新对象。相同数量的分配,相同的内存占用。