在使用spring、hibernate和tiles作为我的when应用程序时,我似乎遇到了内存泄漏问题。我认为这可能是因为我的应用程序在两次部署之间没有进行自我清理。我经常部署和取消部署,因为我目前正在学习所有这些框架。
我应该做些什么来清理我的web应用程序?我目前什么也没做,因为我认为Java会自动做内存清理,但是我非常确定它不会在spring中做所有的事情,因为tomcat一直在抱怨永久内存问题。
我对是否需要运行某些方法才能保持干净感到困惑。我读到了一个弹簧钩子,它在某个地方注册了应用程序,那么当它关闭时,应用程序会被正确地清理吗?我不确定在spring的新版本(3.1)中是否有必要这样做。
例如,tomcat一直告诉我,我没有正确地注销JDBC驱动程序(但是,我认为tomcat在检测到它时会自动取消注册)。
我知道这是一个非常模糊的问题,但如果有人能提到一些需要做的事情,以防止我的应用程序泄漏,我可以自己谷歌他们。
谢谢!
发布于 2012-01-23 09:50:29
Hibernate 4.0引入了jboss-logging作为一种依赖,这似乎会导致永久泄漏(参见https://issues.jboss.org/browse/JBLOGGING-66)。
我不确定可以做些什么来正确地修复它,但作为一种变通方法,将jboss-logging移到tomcat lib目录中似乎是可行的。
发布于 2012-01-11 14:27:05
无论如何,在部署新版本之前,您应该尽可能长时间地关闭您的生产tomcat。(这需要有两个tomcats和一个故障转移机制,或者您只是接受服务关闭的时间比更新长一秒。)
据我所知,这是确保内存泄漏(也考虑烫发)不会做任何有害事情的唯一方法。
发布于 2012-01-11 14:42:00
这听起来像是我在使用Hibernate的项目中遇到的问题。
Hibernate为您使用的每个域对象生成代理。这些代理保存在永久生成空间下,它们不会在应用程序重新启动/重新部署时被清理。默认情况下,PermGen空间使用的内存量相对较小,因此您可以尝试使用-XX:MaxPermSize java参数递增它。这可能会缩短出现内存错误之前的时间,但我知道这个问题没有一个完整的解决方案。您最终将不得不自己重新启动tomcat it。
对于jdbc问题,首先,如果您手动使用该连接,请确保在try catch finally块中正确关闭了该连接。如果您不以这种方式使用connection对象,那么它可能再次与Hibernate相关。
https://stackoverflow.com/questions/8813617
复制相似问题