有类似的问题,但没有得到关注的答案..
在这里它说“解决这个问题的一个技巧是 JDBC 驱动程序由公共类加载器而不是应用程序类加载器加载,你可以通过将驱动程序的 jar 传输到 tomcat lib 中而不是将其捆绑在 web 应用程序的 war 文件中来做到这一点
不明白通过普通类加载器加载是什么意思,以及它与应用程序类加载器有何不同。
有类似的问题,但没有得到关注的答案..
在这里它说“解决这个问题的一个技巧是 JDBC 驱动程序由公共类加载器而不是应用程序类加载器加载,你可以通过将驱动程序的 jar 传输到 tomcat lib 中而不是将其捆绑在 web 应用程序的 war 文件中来做到这一点
不明白通过普通类加载器加载是什么意思,以及它与应用程序类加载器有何不同。
这意味着加载 JDBCDriver 类的 ClassLoader 是应用程序服务器的类加载器,它是应用程序类加载器的父级。因此,驱动程序可用于您服务器上的每个应用程序,并且不会在每次重新启动应用程序时重新加载(如果您没有正确取消注册,可能会导致 permgen 问题)
每次部署应用程序并从那里加载一个类(以使用它)时,它将由应用程序类加载器加载。应用程序越多,加载的“相同”类就越多。如果您使用 tomcats 的“通用”类加载器,则每次安装 tomcat 时该类只会加载一次。
OutOfMemoryError: PermGen space
如果您使用 Tomcat 的热重新部署功能,通常只会出现问题。如果您只是在部署中使用了大量的类,也会发生这种情况。
增加 VM 中可用的 PermGen 数量将解决大量类问题。这可以通过向环境变量添加-XX:MaxPermSize=128m
or来完成(这通常可以在 Tomcat 启动脚本中完成)。如果您直接启动 Tomcat,您可以在 shell 中导出这些环境变量。-XX:MaxPermSize=256m
JAVA_OPTS
CATALINA_OPTS
不幸的是,这并不能完全解决重新部署的问题,它只会使您可以在 PermGen 用完之前重新部署更多次。要解决此问题,您需要确保您的 Web 应用程序正确且完整地卸载。这包括确保由您的 webapp 启动的所有线程都停止,并且加载的 JDBC 驱动程序被正确取消注册等。解决此问题的另一种方法是在对应用程序进行更改时不使用热重新部署并重新启动 Tomcat。