我很好奇是否有任何与.Net的AppDomain类似的Java抽象。
特别是,我很好奇,因为我发现使用我们的Coldfusion / J2EE服务器,我们需要每隔几天重新启动它,因为内存泄漏缓慢,我们还没有能够轻松跟踪。这可能会破坏我们长期运行的流程,而且我们真的想要一种方法,当人们超过一定的时间段/内存阈值时,慢慢地将人们推向新的JVM。
从我有限的.Net经验来看,我非常确定这是IIS和AppDomains能够通过回收内存压力下的AppDomain无缝管理的一种情况。如果我在这个场景中帮助AppDomains,请告诉我。
有什么建议吗?
答案 0 :(得分:10)
我认为这里接受的答案有点误导。简单地说“不,你不能”不是整个故事。问题集中在卸载服务器进程中的Java类,以便在没有进程重启的情况下从JVM进程中删除泄漏代码。 OP不要求AppDomain提供类似进程的内存隔离功能,而是要求在正在运行的JVM中卸载类。我说类似于流程,因为在引擎盖下,AppDomain不是一个进程,而是享受操作系统提供的一流进程的一些隔离方面。提到的隔离JSR指的是这种“类似进程”的隔离。可以卸载java ClassLoaders和类,而无需循环托管JVM的OS进程。这里提到了几种方法:SO 148681。在Java中执行此操作并非易事或优雅,但它是可能的。
答案 1 :(得分:8)
不幸的是,没有。
Java世界中的类似概念是Isolate,它首先出现在JSR 121中。这是一个未来JVM功能的API,可以在同一个JVM中运行的不同应用程序之间进行安全分离和通信。 JSR出版后(2004年左右),Sun的一个研究团队在巴塞罗那项目中工作。该项目试图在Sun的HotSpot 1.5 VM中实现Isolation API。两年后,他们发布了SPARC / Solaris的原型。由于稳定性问题,Windows / Linux版本从未发布过。
最近,SUN向J2ME推出了限量版Isolation API,重点是在没有主动提供它们的环境中提供“多个进程”。最近,我们还询问了Sun在为标准JVM实现Isolate API方面的状态,他们的回应是他们计划发布一个支持有限的JVM。他们计划提供加载/卸载隔离的功能,但无法在它们之间进行通信。
此外,还有一个古老的研究方法来构建与Isolates兼容的JVM版本,称为JanosVM(java 1.1),但我怀疑它今天有用。
希望这会有所帮助......
答案 2 :(得分:0)
基于时间或特定标准(例如增加内存消耗和内存使用威胁)来回收单个JVM是我使用的App Server高级版本WebSphere的功能。如果您的App Server没有该功能,那么制作一些shell脚本以提供类似该功能的东西应该是可行的。
这很好地假设:
A)。来自用户的请求被喷洒在更大的JVM集周围。 B)。所有请求都是无状态的,或者有一些状态复制功能。复制是WebSphere和WebLogic的一项功能,我猜其他应用服务器也具备此功能。
在这样的环境中,没有必要“慢慢”将人们移动到其他服务器。我们只需要知道我们可以安全地停止任何一个服务器/ JVM,并且这些会话将在另一个实例上启动。