【问题标题】:Java AppDomain like abstraction?Java AppDomain 喜欢抽象吗?
【发布时间】:2010-11-06 14:15:00
【问题描述】:

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

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

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

有什么建议吗?

【问题讨论】:

    标签: java .net jakarta-ee coldfusion appdomain


    【解决方案1】:

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

    假设这很有效:

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

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

    【讨论】:

    • 感谢您的评论。不幸的是,我的 Web 应用程序目前既不是无状态的,也无法复制,因为会话不可序列化。也许最好让其中的所有内容都可序列化。
    【解决方案2】:

    很遗憾,没有。

    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。他们计划提供加载/卸载 Isolates 的能力,但不能在它们之间进行通信。

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

    希望这会有所帮助...

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 没错。感谢您的回复。
      猜你喜欢
      • 1970-01-01
      • 2010-12-21
      • 2011-08-17
      • 2012-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-27
      相关资源
      最近更新 更多