如何避免GeneratedSerializationConstructorAccessor问题?

jam*_*mes 6 java serialization constructor garbage-collection accessor

我们有一个接收SOAP请求的Java应用程序,在很多请求之后我们注意到GC停止了全世界卸载很多GeneratedSerializationConstructorAccessor类.这是一个很大的性能影响.

有谁知道如何避免这种情况或者至少显着减少创建的GeneratedSerializationConstructorAccessor类的数量?

Bre*_*ail 5

使用以下选项之一:

-Dsun.reflect.inflationThreshold=30
Run Code Online (Sandbox Code Playgroud)

在本机访问器"膨胀"到生成的访问器之前,通过构造函数/方法/字段增加调用次数.默认值为15.

-Dsun.reflect.inflationThreshold=0
Run Code Online (Sandbox Code Playgroud)

完全禁用通货膨胀.有趣的是,这个选项似乎不会影响构造函数,但它确实适用于方法.

您可以使用简单的测试应用程序测试选项:

public class a {
  public static void main(String[] args) throws Exception {
    for (int i = 0; i < 20; i++) {
      a.class.getDeclaredConstructor(null).newInstance(null);
    }
  }

  private static int x;
  public a() {
    new Throwable("" + x++).printStackTrace();
  }
}
Run Code Online (Sandbox Code Playgroud)

编辑(2013年12月29日):-Dsun.reflect.noInflation=true选项禁用通胀机制,而是立即使用生成的访问器,因此您不需要该选项.


mdm*_*dma 0

来自http://coding.derkeiler.com/Archive/Java/comp.lang.java.programmer/2006-11/msg00122.html

这些类是反射机制的一部分。从 Java 1.3 左右开始,反射已经通过生成类来执行访问来实现。它的使用速度要快得多,但创建时间会更长,并且会扰乱永久代。

序列化使用它们来读/写字段、执行方法(readObject、writeObject、readObjectNoData、readResolve)并调用不可序列化的基类构造函数(最后一个代码不可验证)。

看来它们只是暂时用于序列化/反序列化给定类的对象。正如文章指出的,这些可能是使用 SoftReferences 保存的,因此请确保您的应用程序有足够的内存,并且这些内存的回收频率会降低。

令人惊讶的是,似乎没有任何其他解决方案。