0

最近我创建了一个基于 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 来执行此操作,由于内存不足而失败。

怎么了????

4

1 回答 1

4

(我假设您所说的空闲线程是应用程序线程。如果您正在谈论 Tomcat 的工作线程,那么它们在空闲时应该不会导致 permgen 问题。)

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

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

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

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

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

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

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

于 2009-12-07T06:45:08.537 回答