Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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 sun.reflect.GeneratedSerializationConstructor类如何生成_Java_Tomcat_Garbage Collection - Fatal编程技术网

Java sun.reflect.GeneratedSerializationConstructor类如何生成

Java sun.reflect.GeneratedSerializationConstructor类如何生成,java,tomcat,garbage-collection,Java,Tomcat,Garbage Collection,为了打印web应用程序的GC日志,在tomcat启动之前,添加以下参数: -Xms256m -Xmx512m -XX:PermSize=128M -XX:MaxPermSize=512M -Xloggc:D:/TomcatGc.log 但是,以下信息连续打印在终端上 [Unloading class sun.reflect.GeneratedSerializationConstructorAccessor339] [Unloading class sun.reflect.Generate

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

-Xms256m 
-Xmx512m 
-XX:PermSize=128M 
-XX:MaxPermSize=512M
-Xloggc:D:/TomcatGc.log
但是,以下信息连续打印在终端上

[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]
我的问题是:

  • 为什么会生成这些类?我想了解这一点 概念,但找不到任何相关信息

  • 如何防止GC卸载它们

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


    更多信息@pXL已经回答了您的第一个问题,但是:

  • 如何防止GC卸载它们
  • 你不能。你到底为什么要这么做?它们不再被引用,这意味着没有可访问的实例,因此它们有资格进行垃圾收集,因此它们被垃圾收集,这意味着卸载


    防止这样做既没有意义,也会适得其反。

    不同类型的访问者

    方法访问器和构造函数访问器是本机的或生成的。这意味着我们要么对方法使用NativeMethodAccessorMPL或GeneratedMethodAccessor,要么对构造函数使用NativeConstructorAccessorMPL和GeneratedConstructorAccessor。 访问器将是本机的或生成的,由两个系统属性控制和决定:

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

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


    更多细节可以在原始的

    中找到,谢谢你的回答。我已经认识到我犯了一个愚蠢的错误。谢谢你的回答。但我还有一个问题。如果堆空间不足,为什么JVM不抛出OutOfMemoryError:Java堆空间异常。@Felix它将抛出OutOfMemoryError,但是,首先它会尝试通过删除未使用的对象来清理堆,如果堆中的所有对象都在使用,并且GC无法为新对象找到可用空间,那么它确实会抛出OfMemoryError再次感谢您的回答。