java.lang.OutOfMemoryError:PermGen空间解决方案

时间:2013-10-09 13:18:28

标签: java classloader heap-memory

有类似的问题,但没有人关注答案。

Here它说“解决这个问题的一个问题是,JDBC驱动程序是由公共类加载器加载而不是应用程序类加载器,你可以通过将驱动程序的jar传输到tomcat lib而不是捆绑它来实现网络应用程序的战争文件

不明白通过公共类加载器加载意味着什么,它与应用程序类加载器有什么不同。

3 个答案:

答案 0 :(得分:3)

这意味着加载JDBCDriver类的ClassLoader是应用程序服务器的类加载器,它是应用程序类加载器的父类。因此,驱动程序可用于服务器上的每个应用程序,并且不会在每次重新启动应用程序时重新加载(如果未正确注销,可能会导致permgen问题)

答案 1 :(得分:1)

每次部署应用程序并从那里加载一个类(使用它)时,它都将由应用程序类加载器加载。应用程序越多,加载的“相同”类就越多。如果你使用tomcats的“common”类加载器,那么每个tomcat安装只会加载一次类。

答案 2 :(得分:1)

如果您使用Tomcat的热重新部署功能,

OutOfMemoryError: PermGen space通常只是一个问题。如果您只是在部署中使用了大量的类,也会发生这种情况。

增加VM中可用的PermGen数量将解决大量类问题。这可以通过将-XX:MaxPermSize=128m-XX:MaxPermSize=256m添加到环境变量JAVA_OPTSCATALINA_OPTS来完成(这通常可以在Tomcat启动脚本中完成)。如果要直接启动Tomcat,可以在shell中导出这些环境变量。

不幸的是,这并没有完全解决重新部署的问题,它只能使它能够在用完PermGen之前重新部署更多次。要解决此问题,您需要确保您的网络应用程序正确且完整地卸载。这涉及确保您的webapp启动的所有线程都停止,并且加载的JDBC驱动程序在其他方面未正确注册。解决此问题的另一种方法是在更改应用程序时不使用热重新部署并重新启动Tomcat。