12

我很好奇是否有任何类似于 .Net 的 AppDomain 的 Java 抽象。

特别是,我很好奇,因为我发现对于我们的 Coldfusion/J2EE 服务器,我们需要每隔几天重新启动它一次,因为我们还无法轻松追踪到缓慢的内存泄漏。这可能会破坏我们长期运行的进程,我们真的想要一种方法来慢慢地将人们推向新的 JVM,因为他们的年龄超过了某个时间段/内存阈值。

根据我有限的 .Net 经验,我很确定这是 IIS 和 AppDomains 能够通过回收承受内存压力的 AppDomains 来相当无缝地管理的一种情况。如果我在 AppDomains 上提供帮助,请告诉我。

有什么建议么?

4

3 回答 3

12

我认为 Yiannis 的回答有点误导。简单地说“不,你不能”并不是故事的全部。问题的重点是在服务器进程中卸载 Java 类,以在不重启进程的情况下从 JVM 进程中删除泄漏代码。OP 不是要求 AppDomain 提供的类似进程的内存隔离功能,而是要求在运行的 JVM 中卸载类的能力。我说类似进程,因为在后台,AppDomain 不是进程,而是享有操作系统提供的一流进程的一些隔离方面。提到的隔离 JSR 指的是这种“类似进程”的隔离。卸载 java ClassLoaders 和类,而不循环托管 JVM 的 OS 进程是可能的。这里提到了几种方法:SO 148681. 在 Java 中做到这一点并不是微不足道的,也不是优雅的,但它是可能的。

于 2009-09-12T02:24:15.747 回答
8

抱歉不行。

Java 世界中的类似概念是 Isolate,它首先出现在 JSR 121 中。这是一个用于未来 JVM 功能的 API,它将允许在同一 JVM 中运行的不同应用程序之间进行安全分离和通信。在 JSR 发布后(大约 2004 年),Sun 的一个研究团队参与了巴塞罗那项目。这个项目试图在 Sun 的 HotSpot 1.5 VM 中实现隔离 API。两年后,他们发布了 SPARC/Solaris 的原型。由于稳定性问题,Windows/Linux 版本从未发布。

最近,SUN 向 J2ME 引入了 Isolation API 的限制版本,重点是在没有主动提供它们的环境中提供“多进程”。最近,我们还向 Sun 询问了他们在将 Isolate API 实施到标准 JVM 方面的情况,他们的回答是他们计划发布一个支持有限的 JVM。他们计划提供加载/卸载 Isolate 的能力,但不能在它们之间进行通信。

此外,还有一个旧的研究努力来构建一个与 Isolates 兼容的 JVM 版本,称为 JanosVM (java 1.1),但我怀疑它在今天是否有用。

希望这可以帮助...

于 2009-07-17T14:47:01.387 回答
0

根据时间或特定标准(例如不断增长的内存消耗和内存使用阈值)回收单个 JVM 是我使用的应用程序服务器 WebSphere 的高级版本的一项功能。如果您的 App Server 没有该功能,那么制作一些 shell 脚本来提供类似该功能的东西应该是可行的。

假设这很好用:

一个)。来自用户的请求散布在更大的 JVM 集上。乙)。所有请求都是无状态的,或者有一些状态复制能力。复制是 WebSphere 和 WebLogic 的一种能力,我猜其他应用服务器也有这种能力。

在这样的环境中,没有必要“慢慢地”将人员转移到其他服务器。我们只需要知道我们可以安全地停止任何一个服务/JVM,并且这些会话将在另一个实例上启动。

于 2009-06-29T07:02:47.930 回答