jam*_*mes 6 java serialization constructor garbage-collection accessor
我们有一个接收SOAP请求的Java应用程序,在很多请求之后我们注意到GC停止了全世界卸载很多GeneratedSerializationConstructorAccessor类.这是一个很大的性能影响.
有谁知道如何避免这种情况或者至少显着减少创建的GeneratedSerializationConstructorAccessor类的数量?
使用以下选项之一:
-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选项禁用通胀机制,而是立即使用生成的访问器,因此您不需要该选项.
来自http://coding.derkeiler.com/Archive/Java/comp.lang.java.programmer/2006-11/msg00122.html
这些类是反射机制的一部分。从 Java 1.3 左右开始,反射已经通过生成类来执行访问来实现。它的使用速度要快得多,但创建时间会更长,并且会扰乱永久代。
序列化使用它们来读/写字段、执行方法(readObject、writeObject、readObjectNoData、readResolve)并调用不可序列化的基类构造函数(最后一个代码不可验证)。
看来它们只是暂时用于序列化/反序列化给定类的对象。正如文章指出的,这些可能是使用 SoftReferences 保存的,因此请确保您的应用程序有足够的内存,并且这些内存的回收频率会降低。
令人惊讶的是,似乎没有任何其他解决方案。