2013-10-09 51 views
1

类似的问题存在,但受关注没有答案..java.lang.OutOfMemoryError:PermGen的空间解决方案

Here它说,“一个黑客来解决这个问题是JDBC驱动程序的类加载器加载比应用程序的类加载器,您可以通过转移驱动程序的jar到Tomcat的lib,而不是捆绑于Web应用程序的WAR文件

没明白是什么意思由通用类加载器加载做到这一点,是如何从应用程序类加载它不同。

回答

3

这意味着加载JDBCDriver类的ClassLoader是您的应用程序服务器的类加载器,它是您的应用程序类加载器的父类。因此,驱动程序可用于您的服务器上的每个应用程序,而不是重新加载您的应用程序的每次重新启动(这可能会导致PermGen的麻烦,如果你没有正确注销吧)

1

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

+0

你确定这是它的工作原理吗?无论有多少次启动应用程序,只能加载一次类是可能的? – Andy897

1

OutOfMemoryError: PermGen space通常只有一个问题,如果你使用热重新部署Tomcat的功能。如果您的部署中只使用大量类,也会出现这种情况。

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

不幸的是,这并没有完全解决重新部署的问题,它只是让你可以重新部署更多次,然后用完PermGen。要解决此问题,您需要确保您的网络应用正确完整地卸载。这涉及确保您的Web应用程序启动的所有线程都停止,并且加载的JDBC驱动程序在其他事物中未正确注册。解决这个问题的另一种方法是在对应用程序进行更改时不使用热重新部署并重新启动Tomcat。

相关问题