gpt4 book ai didi

oracle - 热重新部署和 Oracle 数据库的 Permgen 内存泄漏

转载 作者:行者123 更新时间:2023-11-28 21:50:20 26 4
gpt4 key购买 nike

我有一个在生产环境中运行的基于 SpringRoo 的应用程序,它在一些热重新部署后导致严重的 permgen 内存泄漏。

为了“找到并修复”泄漏并减少分析过程中的变量,我使用 roo 创建了一个简单、流线型的应用程序,并且获得了相同的行为。该项目(使用 Spring Roo (1.2.3.RELEASE) 创建)仅保留一个名为“Person”的实体和一个名为“name”的字符串字段。

我在 Tomcat 7.0.39 上部署了 war,使用 Oracle 11.2.0.2 作为数据库。每次重新部署后,我都会在 catalina.out 中收到此消息

INFO: Undeploying context [/ojdbc-0.1.0.BUILD-SNAPSHOT]
mag 06, 2013 10:50:43 AM org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
SEVERE: The web application [/ojdbc-0.1.0.BUILD-SNAPSHOT] registered the JDBC driver [oracle.jdbc.OracleDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.

两次热重新部署后,我得到一个permgen 错误:

mag 06, 2013 10:51:08 AM org.apache.catalina.startup.HostConfig deployWAR
INFO: Deploying web application archive /Applications/apache-tomcat-7.0.39/webapps/ojdbc- 0.1.0.BUILD-SNAPSHOT.war
Exception in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]"
Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]"
Exception in thread "RMI TCP Connection(idle)" mag 06, 2013 10:51:17 AM ServerCommunicatorAdmin reqIncoming
WARNING: The server has decided to close this client connection.
java.lang.OutOfMemoryError: PermGen space
Exception in thread "RMI TCP Connection(idle)" java.lang.OutOfMemoryError: PermGen space

我尝试使用 VisualVm/EclipseMemory Analyzer 对此进行分析,这就是我目前得到的结果。

VisualVM screnshot with PermGen behaviour

GC Roots obtained from dominator tree analysis

事实上,我没有在其他数据库(例如 PostgreSQL 或 Hypersonic)中观察到这种行为。是否与导致泄漏的 Oracle 相关?

Here是一个包含 roo 脚本生成器的 zip 存档,anche .hprof 转储文件。

最佳答案

尝试将 Oracle JDBC 驱动程序移动到 Tomcat 的 lib 目录中,而不是在应用程序的 lib 文件夹中。看起来 OracleDiagnosabilityMBean 正在处理 Catalina。

编辑:由于您无法控制 Tomcat,请尝试像这样包装 Oracle 类的加载位置(除了为您的 Oracle init 替换 AppContext):

http://cdivilly.wordpress.com/2012/04/23/permgen-memory-leak/

//somewhere in application startup, e.g. the ServletContextListener
try {
final ClassLoader active = Thread.currentThread().getContextClassLoader();
try {
//Find the root classloader
ClassLoader root = active;
while (root.getParent() != null) {
root = root.getParent();
}
//Temporarily make the root class loader the active class loader
Thread.currentThread().setContextClassLoader(root);
//Force the AppContext singleton to be created and initialized
sun.awt.AppContext.getAppContext();
} finally {
//restore the class loader
Thread.currentThread().setContextClassLoader(active);
}
} catch ( Throwable t) {
//Carry on if we get an error
LOG.warning("Failed to address PermGen leak");
}

关于oracle - 热重新部署和 Oracle 数据库的 Permgen 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16396026/

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