当前位置: 首页 > 面试题库 >

我有JAXB类加载器泄漏吗

胡厉刚
2023-03-14
问题内容

我在Glassfish上部署了一个应用程序。随着时间的流逝,加载的类的数量攀升至数百万,而我的表现似乎正在上升。

为了帮助排除故障,我在jvm参数中添加了以下内容。-XX:+ PrintGCDetails -XX:+ TraceClassUnloading -XX:+
TraceClassLoading

现在,当观看输出时,我看到相同的类一遍又一遍地加载。基本上,每次调用Web服务并且使用JAXB来处理xml时。

[从 JVM_DefineClass 加载com.strikeiron.ZIPCodesInRadius $
JaxbAccessorF_userID ] [ 从 JVM_DefineClass
加载com.strikeiron.ZIPCodesInRadius $ JaxbAccessorF_userID ]

这是否表明泄漏?如果可以,我该如何解决?


问题答案:

我发现一个类似的线程正在描述我遇到的相同问题。
http://forums.java.net/jive/thread.jspa?threadID=53362

我还在https://github.com/javaee/jaxb-v2/issues/581找到了一个错误

基本上,问题是每次调用bean时我都在做一个新的JAXBContext(“
your.class.xsd”)。根据错误的说法,“调用JAXBContext.newInstance(…)意味着要重新加载所有内容,因为要(重新)使用当前或指定的类加载器。”

解决方案是创建一个效果很好的单例。

public enum JAXBContextSingleton {

INSTANCE("your.class.xsd");
private JAXBContext context;

JAXBContextSingleton(String classToCreate) {
    try {
        this.context = JAXBContext.newInstance(classToCreate);
    } catch (JAXBException ex) {
        throw new IllegalStateException("Unbale to create JAXBContextSingleton");
    }
}

public JAXBContext getContext(){
    return context;
}

}

并使用单例

JAXBContext context = JAXBContextSingleton.INSTANCE.getContext();


 类似资料:
  • 问题内容: 昨天,我将第一个Grails(2.3.6)应用程序部署到开发服务器并开始对其进行监视。我刚得到一个自动监视器,指出CPU已固定在这台计算机上,因此我通过SSH进入了它。我跑去,发现固定服务器的是我的Java应用程序的PID。我还注意到内存为40%。几秒钟后,CPU停止固定,下降到正常水平,内存下降到〜20%范围。经典大型GC。 在收集时,我进行了堆转储。GC之后,然后我在JVisual

  • 我在Tomcat 8中热重新部署简单的Grails应用程序时遇到问题。 我的设置如下: Grails 2.5.1全新的应用程序,刚刚使用创建 Tomcat 8.0.28(64位Linux二进制版本) Java1.80_65-b17 HotSpot服务器VM Tomcat也是一个全新的安装,只修改了两件事(因为我想在生产中使用它们): 服务器xml

  • 我决定是时候学习如何使用泄漏金丝雀来检测我的应用程序中的泄漏了,就像我一直做的那样,我尝试在我的项目中实现它,以真正了解如何使用该工具。实现它很容易,困难的部分是阅读工具向我扔回来的东西。我有一个scrollview,当我上下滚动时,它似乎在内存管理器中积累内存(即使它没有加载任何新数据),因此我认为这是跟踪泄漏的一个很好的候选对象,结果如下: 它看起来像v7。小装置。RecyclerView正在

  • 大家好,我的程序员们。 我有一些代码,spring工具套件编辑器的反应也不一样,也许你们一些聪明人知道为什么。 有人能告诉我为什么这是不可能的吗: 但这是!? 第一行代码给了我一个警告“Resource leak:unassigned closeable value is never close”,正如您所看到的,我在try/catch中使用了一个finally,如果对象不为空,它应该总是关闭对象

  • 日安。我在应用程序中使用了CBC模式AES加密,并使用了javax.crypto.cipher类。对于CBC来说,在加密下一部分数据之前,我们应该调用Cipher.init()方法。我注意到这会导致内存不断增长。在某些设备上,它是“未知”类型的内存,在其他设备上,它是“本机堆”。问题是,当加密大文件时,内存会增长,并且在加密完成后不会释放。我已经检查过,如果在加密之前不调用cipher.init(

  • 框架中所有的类都是通过类加载器(ClassLoader)加载的,通过Loader我们可以实现类的统一管理。下面我们一起来看看Loader提供了哪些加载方法: 1. Loader::import 加载一个类或者加载一个包 方法原型 import( $classPath, $type = IMPORT_APP, $extension=EXT_PHP ) 参数名称 参数说明 $classPath 文件的