【问题标题】:What is wrong with runing app in tomcat server?在 tomcat 服务器中运行应用程序有什么问题?
【发布时间】:2010-12-23 21:36:17
【问题描述】:

最近我创建了一个基于maven的web项目,并使用tomcat作为应用服务器来调试...

但是直接从项目上下文菜单运行应用程序后,tomcat 经常死机(pergem 错误意味着内存不足)。

最糟糕的是它创建了许多空闲线程并且它们都不能被手动杀死。

而且tomcat的状态也不能被NetBeans检测到,不能停止和重启。 我必须重新启动系统才能清理它们。

我的系统是 Fedora 12 x86... Java 版本为 SUN JDK 6 update 17。 NetBeans 版本是 6.7.1。

我试图为此创建一个错误,但 NetBeans 开发人员拒绝了它......我很惊讶这是使用 NetBeans 开发 Web 应用程序的一大障碍。

今天我在最新的NetBeans 6.8rc1中使用了JBoss 5.1,也遇到了同样的问题... 我已经尝试调整 VM 参数并分配更多内存但没有效果。

我已经通过 seam ant build script 将几个 seam 示例部署到 JBoss 5.1,没有问题。 但是我改用 NetBeans 来执行此操作,由于内存不足而失败。

怎么了????

【问题讨论】:

  • 您尝试调整VM参数,但成功了吗?尝试调用Runtime.getRuntime().maxMemory(),看看你的设置有没有考虑到
  • 检查 JRebel 是否支持您当前的配置,也许它可以解决您的问题:zeroturnaround.com/jrebel
  • Runtime.getRuntime().maxMemory() 在这里不相关。 PermGen 空间用于保存不太可能被 GC 处理的代码和相关数据。 Web 容器在开发条件下反复取消部署和重新部署是一种特殊情况,因此您要么需要分配更多的 PermGen(特别是!),要么需要启用类的 GC。

标签: java tomcat netbeans permgen


【解决方案1】:

(我假设你说的空闲线程是应用程序线程。如果你说的是Tomcat的工作线程,那么它们在空闲时应该不会引起permgen问题。)

我试图为此创建一个错误,但 NetBeans 开发人员拒绝了它......我很惊讶......

我很惊讶。这并不是真正的 NetBeans 问题。它甚至不是真正的 Tomcat 或 JBoss 问题。

空闲/孤立的应用程序线程的问题是您无法安全地杀死正在运行的 JVM 中的线程。如果没有这样做的能力,您将无法阻止(在这种情况下)permgen 空间的泄漏。这本质上是一个 Java 平台问题。只有当 JVM 支持 JSR 121 定义的 Isolate 机制时才能解决。

但假设您的问题与做热部署有关,那么您需要担心的不仅仅是空闲的应用程序线程。如果您正在重新部署 any 类的 any 可达实例,这将导致原来的旧类加载器及其加载的所有类保持可达。

...这是使用 NetBeans 开发 Web 应用程序的一大障碍。

解决方案是不时重启您的 Web 容器。这将清除空闲线程和其他杂物并释放泄漏的 permgen 空间。你可以通过运行更大的堆和更多的 permgen 来改善它,但你不能让它消失,特别是如果一些孤立的线程不是空闲的......

哦,是的,不要成为一个大婴儿!这不是一个表演停止者,它只是一个小不便:-)

【讨论】:

  • 虽然我一般同意你没有惊喜,但它确实与空闲线程无关。相反,它与默认情况下不被垃圾收集的类有关。如果你真的想为额外的 GC 工作付出代价,你可以启用类的垃圾收集。通常,您不想在生产服务器中执行此操作,而且就个人而言,我宁愿不时重新启动 Tomcat(并将 max permgen 空间设置得足够高,以使“不时”不太频繁。
  • 线程只有在实际运行用户代码的情况下才会进入它,从而保护它免受 GC,即使您启用了类的 GC。如果是这种情况,则用户的应用程序很糟糕; J2EE 应用程序不应该这样工作。
  • 在生产服务器中,您只需要足够的 permgen 空间来存储您实际使用的代码和相关数据。它不会继续增长。您所看到的是部署大量演示代码或重复部署的影响。无论哪种方式,提高您的 PermGen 空间都会对您有所帮助。
  • 无论如何,当然没有必要为了重启网络服务器而重启系统!
  • @BobKerns - 1) webcontainer == webserver != 系统。 2) 如果由于线程泄漏,类仍然可以访问,则启用类垃圾回收不会解决问题。 3) 还有其他一些事情会导致类加载器以及它们的所有类保持可访问性。 4) 他所说的空闲线程对我来说听起来确实像应用程序线程......而不是请求线程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-05
  • 2011-04-20
  • 2013-06-23
  • 1970-01-01
  • 2018-02-09
  • 1970-01-01
  • 2014-03-02
相关资源
最近更新 更多