我有一个在生产环境中运行的基于 SpringRoo 的应用程序,在一些热重新部署后会导致严重的 permgen 内存泄漏。
为了“发现并修复”泄漏并减少分析过程中的变量,我使用 roo 创建了一个简单、流线型的应用程序,并且获得了相同的行为。该项目(使用 Spring Roo (1.2.3.RELEASE) 创建)简单地保存了一个名为“Person”的实体和一个名为“name”的字符串字段。
我将战争部署在 Tomcat 7.0.39 上,使用 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 对此进行分析,这就是我目前所得到的。
事实是我没有观察到其他数据库(例如 PostgreSQL 或 Hypersonic)的这种行为。是否有与 Oracle 相关的东西导致泄漏?
这是一个包含 roo 脚本生成器的 zip 存档,以及 .hprof 转储文件。