gpt4 book ai didi

java - 在运行时加载驱动程序 jar 文件导致 Perm Gen Space Error

转载 作者:行者123 更新时间:2023-11-28 23:33:51 25 4
gpt4 key购买 nike

我创建了一个 REST 服务,我在运行时在其中加载 JDBC 驱动程序 jar。下面是执行此操作的代码:

Driver driverInstance;
URLClassLoader driverClassLoader;
driverClassLoader = new URLClassLoader (new URL[] { "c:/mysql.jar" }, System.class.getClassLoader());
Class<?> driverClass = driverClassLoader.loadClass("oracle.jdbc.driver.OracleDriver");
Connection conn = driverInstance.connect(connectionString, userDbCredentials);

使用此连接将数据加载到数据库后,我将关闭连接driverClassLoader。但是运行一段时间后,我得到了java.lang.OutOfMemoryError:Tomcat 服务器中的 PermGen 空间

我获取了堆转储,并使用 eclipse Memory Analyzer 打开它,我发现了下面的 Leak suspect 消息:“org.apache.catalina.loader.WebappClassLoader”的 13 个实例,由“java.net.URLClassLoader @ 0xc155fc10”加载,占用 14,083,776 (32.21%) 字节

我知道这是由于在运行时加载了驱动程序 jar,但我无法找到解决方案。

最佳答案

当您加载 JDBC 驱动程序类时,它会向 java.sql.DriverManager 注册自己。即使您尝试让系统类加载器成为您的 URLClassLoader 的父级,我相信它会从您的 WebappClassLoader 继承 AccessControlContext,从而引用它.使用 Eclipse 内存分析器 (MAT) 分析引用可以帮助验证 - see this blog post for instructions .

假设 JDBC 驱动程序实际上是泄漏源,解决您的问题的方法是调用 java.sql.DriverManager.deregisterDriver() 显式注销驱动程序,最好是在ServletContextListenercontextDestroyed()

通常你可以让我的ClassLoader leak prevention library为您处理注销,但是由于驱动程序是在单独的类加载器中加载的,因此无法开箱即用。但是,您可以进行一些子类化/修改。好处是您可以免费获得更多的泄漏保护。

您是否真的想要并且需要在运行时从应用程序外部加载驱动程序 - 嗯,这是一个单独的问题...

祝你好运!

关于java - 在运行时加载驱动程序 jar 文件导致 Perm Gen Space Error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26975344/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com