如何生成sun.reflect.GeneratedSerializationConstructorAccessor类

Fel*_*lix 2 java tomcat garbage-collection

为了打印Web应用程序的GC日志,在tomcat启动之前,添加以下参数:

-Xms256m 
-Xmx512m 
-XX:PermSize=128M 
-XX:MaxPermSize=512M
-Xloggc:D:/TomcatGc.log
Run Code Online (Sandbox Code Playgroud)

但是,终端上会不断打印以下信息.

[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor339]
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor336]
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor341]
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor342]
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor340]
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 为什么要生成这些类?我想了解这个概念,但找不到任何有关它的信息.

  2. 如何防止GC卸载它们?

Moh*_*dil 5

这是因为(可能是你在应用程序中使用反射)堆空间不足并GC试图通过卸载未使用的对象来释放一些内存,这就是你看到的原因Unloading class sun.reflect.GeneratedSerializationConstructorAccessor

更多信息--> http://coding.derkeiler.com/Archive/Java/comp.lang.java.programmer/2006-11/msg00122.html


Max*_*lov 5

不同类型的访问器

方法访问器和构造函数访问器是本机的或生成的。这意味着我们对于方法使用 NativeMethodAccessorImpl 或 generatedMethodAccessor,对于构造函数使用 NativeConstructorAccessorImpl 和 generatedConstructorAccessor。访问器可以是本机的或生成的,并由两个系统属性控制和决定:

  1. sun.reflect.noInflation = false (默认值为 false)
  2. sun.reflect.inflationThreshold = 15(默认值为15)

当 sun.reflect.noInflation 设置为 true 时,将始终生成所使用的访问器,并且系统属性 sun.reflect.inflationThreshold 没有任何意义。当 sun.reflect.noInflation 为 false 且 sun.reflect.inflationThreshold 设置为 15(如果未指定,则为默认行为)时,这意味着对于构造函数(或方法)的前 15 次访问,本机生成器将使用后,将提供(从 ReflectionFactory)生成的访问器以供使用。

本机访问器使用本机调用来访问信息,而生成的访问器都是字节代码,因此速度非常快。另一方面,生成的访问器需要时间来实例化和加载(基本上是膨胀,因此控制它的系统属性的名称包括“膨胀”一词)。

更多详细信息可以在原始博客中找到