如何避免GenerateSerializationConstructorAccessor问题?

发布于 2024-09-04 17:53:52 字数 193 浏览 7 评论 0原文

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

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

We have a Java App that receives SOAP requests, and after a lot of requests we notice that the GC stops the world to unload a lot of GeneratedSerializationConstructorAccessor classes. This is a big performance impact.

Does anyone know how to avoid this or at least significantly reduce the count of GeneratedSerializationConstructorAccessor classes created?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

全部不再 2024-09-11 17:53:53

[...] 我们注意到 GC 停止了卸载大量内容
生成的SerializationConstructorAccessor 类。这是一场盛大的表演
影响。

如果您的应用程序使用反射,这是不可避免的,您可以尝试使用 CMS 垃圾收集器,以尽量减少 stop-the-world GC 的影响。

[...] we notice that the GC stops the world to unload a lot of
GeneratedSerializationConstructorAccessor classes. This is a big performance
impact.

As it is impossible to avoid if your application is using reflection, you may try using CMS garbage collector to minimize the impact of the stop-the-world GC.

归途 2024-09-11 17:53:53

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

这些类是
反射机制。自从大约
Java 1.3 反射已
通过生成类来实现
执行访问。速度快多了
使用,但需要更长的时间来创建和
让永久的一代感到不安。

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

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

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

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

These classes are part of the
reflection mechanism. Since around
Java 1.3 reflection has been
implemented by generating classes to
perform the access. It's much faster
use, but takes longer to create and
upsets the permanent generation.

Serialisation uses them to read/write
fields, execute methods (readObject,
writeObject, readObjectNoData,
readResolve) and call the
non-serialisable base class
constructor (this last code is not
verifiable).

It appears they're only used transiently to serialize/deserialize a given class of object. As the article points out, these are probably held using SoftReferences, so ensure that your app has plenty of memory, and these will be reclaimed less often.

Surprisingly, there doesn't appear to be any other solution.

萌︼了一个春 2024-09-11 17:53:52

使用以下选项之一:

-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();
  }
}

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

Use one of the options:

-Dsun.reflect.inflationThreshold=30

Increases the number of calls through a Constructor/Method/Field before a native accessor will be "inflated" to a generated accessor. The default is 15.

-Dsun.reflect.inflationThreshold=0

Disables inflation altogether. Interestingly, this option does not seem to affect constructors, but it does work for methods.

You can test the options with a simple test app:

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();
  }
}

Edit (29-Dec-2013): The -Dsun.reflect.noInflation=true option disables the inflation mechanism and instead immediately uses generated accessors, so you don't want that option.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文