Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何避免GeneratedSerializationConstructor或Accessor问题?_Java_Serialization_Constructor_Garbage Collection_Accessor - Fatal编程技术网

Java 如何避免GeneratedSerializationConstructor或Accessor问题?

Java 如何避免GeneratedSerializationConstructor或Accessor问题?,java,serialization,constructor,garbage-collection,accessor,Java,Serialization,Constructor,Garbage Collection,Accessor,我们有一个接收SOAP请求的Java应用程序,在大量请求之后,我们注意到GC停止了卸载大量生成的SerializationConstructorAccessor类。这对性能有很大影响 有人知道如何避免这种情况,或者至少显著减少已创建的GeneratedSerializationConstructor或Accessor类的数量吗? 这些课程是课程的一部分 反射机制。从那时起 Java1.3反射已经过测试 通过生成类来实现 执行访问。速度快得多 使用,但需要更长的时间来创建和 让永久的一代感到不安

我们有一个接收SOAP请求的Java应用程序,在大量请求之后,我们注意到GC停止了卸载大量生成的SerializationConstructorAccessor类。这对性能有很大影响

有人知道如何避免这种情况,或者至少显著减少已创建的GeneratedSerializationConstructor或Accessor类的数量吗?

这些课程是课程的一部分 反射机制。从那时起 Java1.3反射已经过测试 通过生成类来实现 执行访问。速度快得多 使用,但需要更长的时间来创建和 让永久的一代感到不安

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

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


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

使用以下选项之一:

-Dsun.reflect.inflationThreshold=30
在本机访问器“膨胀”到生成的访问器之前,增加通过构造函数/方法/字段的调用数。默认值为15

-Dsun.reflect.inflationThreshold=0
完全抑制通货膨胀。有趣的是,这个选项似乎并不影响构造函数,但它确实适用于方法

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

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();
  }
}
公共a类{
公共静态void main(字符串[]args)引发异常{
对于(int i=0;i<20;i++){
a、 getDeclaredConstructor(null).newInstance(null);
}
}
私有静态int x;
公共a(){
新的可丢弃(“+x++”).printStackTrace();
}
}
编辑(2013年12月29日):
-Dsun.reflect.noInflation=true
选项禁用膨胀机制,而是立即使用生成的访问器,因此您不需要该选项

[…]我们注意到GC阻止世界卸载大量数据 GeneratedSerializationConstructorAccessor类。这是一场盛大的演出 影响


如果您的应用程序使用的是反射,则无法避免,因此您可以尝试使用以尽量减少停止世界GC的影响。

为什么这个标记为gcc(Gnu编译器集合)?你是想给它贴上垃圾收集器的标签吗?您使用的是gcj(Gnu编译器for Java)?我认为这是一个输入错误,我将其更改为
gc
,事实上,将noInflation设置为true将导致所有访问都通过字节码生成完成。您想将阈值设置为零或更小。@raphw您是对的,谢谢您更正我的错误信息!我根据你的建议编辑了这篇文章。