Java应用程序域的抽象化?

12

我想知道是否有任何类似于.NET的AppDomain的Java抽象。

特别是,我很好奇,因为我们的Coldfusion/J2EE服务器由于一个缓慢的内存泄漏问题而需要每隔几天重新启动。我们一直无法轻松地追踪到这个问题的源头。这会破坏我们长时间运行的进程,我们真的希望能够慢慢地将人们推向超过一定时间/内存阈值的新JVM。

根据我有限的.NET经验,我相信这是IIS和AppDomains可以通过回收内存压力下的AppDomains来相对轻松管理的情况之一。请告诉我是否完全错误地认为AppDomains能够在这种情况下提供帮助。

有什么建议吗?

3个回答

12

我认为Yiannis在这里的回答有些误导性。仅仅说“不行”并不能讲清整个故事。这个问题关注的是在服务器进程中卸载Java类,以从JVM过程中删除泄漏代码而无需进程重启。OP并不要求像AppDomain一样具有类似进程内存隔离的功能,而是需要能够在运行时卸载JVM中的类。我称之为“类似进程”的原因是,由于在幕后AppDomain不是一个进程,但享受操作系统提供给一流进程的某些隔离方面。所提到的隔离JSR是指这种“类似进程”的隔离。在不重新启动托管JVM的操作系统进程的情况下卸载Java ClassLoaders和类是可能的。这里提到了几种方法:SO 148681。在Java中进行这项操作并不简单或优雅,但是它是可能的。


没错,谢谢你的回复。 - Bob Albright

8
很遗憾,不行。
在Java世界中,类似的概念是Isolate,最初出现在JSR 121中。这是一个API,用于未来JVM功能,可以安全地分离和通信不同应用程序在同一JVM中运行。在JSR发布后(大约在2004年),Sun的一个研究团队在巴塞罗那项目中工作。该项目试图在Sun的HotSpot 1.5 VM中实现隔离API。经过两年的努力,他们发布了SPARC / Solaris的原型。由于稳定性问题,Windows / Linux版本从未发布。
最近,SUN向J2ME引入了Isolation API的有限版本,专注于在没有主动提供它们的环境中提供“多个进程”。最近,我们还向Sun询问他们在实施Isolate API到标准JVM方面的状态,他们的回复是计划发布具有有限支持的JVM。他们计划提供加载/卸载隔离区的能力,但不能在它们之间通信。
此外,还有一项旧的研究努力,构建与Isolates兼容的JVM版本,称为JanosVM(java 1.1),但我怀疑它今天是否有任何用处。
希望这可以帮助...

0

基于时间或特定标准(如内存消耗和使用阈值)回收单个JVM是我所使用的高级版本App Server WebSphere的功能。如果您的App Server没有这种能力,那么编写一些shell脚本来实现类似的功能应该是可行的。

假设以下情况下,这种方法非常有效:

a). 用户请求被分配到较大的JVM集合中。 b). 所有请求都是无状态的,或者存在某种状态复制功能。WebSphere和WebLogic具有复制功能,我猜其他应用服务器也有这种能力。

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


感谢您的评论。不幸的是,我的Web应用程序目前既不是无状态的,也无法进行复制,因为会话不可序列化。也许最好的方法是使其中的所有内容都可序列化。 - Bob Albright

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接