Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多个JVM进程能否为公共类共享内存?_Java_Memory_Jvm_Shared Libraries - Fatal编程技术网

Java 多个JVM进程能否为公共类共享内存?

Java 多个JVM进程能否为公共类共享内存?,java,memory,jvm,shared-libraries,Java,Memory,Jvm,Shared Libraries,我想在我的web服务器上运行多个Java进程,每个web应用程序一个。我正在使用一个web框架(Play),它有很多支持类和jar文件,Java进程使用了大量内存。一个播放过程显示大约225MB的“驻留专用”内存。(我正在Mac OS X上用Java 1.7.0_05进行测试。)特定于应用程序的代码可能只有几MB。我知道典型的Java web应用程序是添加到一个服务器进程(Tomcat等)中的JAR,但运行Play的标准方式似乎是作为一个独立的应用程序/进程。如果这些是C程序,那么其中的大部分2

我想在我的web服务器上运行多个Java进程,每个web应用程序一个。我正在使用一个web框架(Play),它有很多支持类和jar文件,Java进程使用了大量内存。一个播放过程显示大约225MB的“驻留专用”内存。(我正在Mac OS X上用Java 1.7.0_05进行测试。)特定于应用程序的代码可能只有几MB。我知道典型的Java web应用程序是添加到一个服务器进程(Tomcat等)中的JAR,但运行Play的标准方式似乎是作为一个独立的应用程序/进程。如果这些是C程序,那么其中的大部分200MB将是共享库,不会在每个应用程序中重复。有没有办法在Java中实现这一点?我看到了一些关于的页面,但这似乎只适用于核心运行时类

如果您使用支持虚拟主机的servlet容器(我相信Tomcat会这样做),您将能够使用。从Play 2.1开始,始终作为根应用程序的要求将被取消,因此您可能能够使用任何servlet容器


如果您可能需要调整war文件,将内容从
WEB-INF/lib
移动到servlet容器的lib目录,以避免再次加载所有类,这可能会影响您的应用程序(如果它使用单例或其他形式的类共享数据)。

此时使用Oracle VM,这是不可能的

但我同意,这将是一个很好的特性,特别是因为Java拥有自动完成这项工作所需的所有信息

最重要的是,我认为JIT是这不能工作的唯一原因:JIT考虑了运行时行为。所以,如果应用程序A使用与应用程序B不同的模式中的某些代码,则会导致在运行时生成不同的汇编代码

但是,通常的“模式”是“这段代码使用的频率”。因此,如果应用程序A经常调用某个方法而B没有调用,他们仍然可以共享代码,因为A已经为优化/编译它付出了代价


您可以尝试将多个应用程序作为WAR文件部署到单个VM中。但根据我的经验,这通常会导致无法正确清理线程局部变量或关闭挂钩的代码出现问题。

在移动平台上,JVM实例之间共享内存的问题更为紧迫,据我所知,Android在Zygote中有一个非常聪明的解决方案:VM被初始化,然后在运行应用程序时,它是
fork()
ed。Linux在RAM页面上使用写时拷贝,所以大部分数据不会被复制


如果您在Linux上运行,并且希望尝试使用Dalvik作为VM,那么移植此解决方案是可能的(我看到有人声称Dalvik上有一个tomcat的工作端口)。我认为这将是一项巨大的工作,最终在内存升级上为您节省几美元。

IBM JDK有一个jvm参数来实现这一点。退房@


这将使它进入下一步:

这不适用于HotSpot,它需要一个支持它的特殊JVM。在我的环境中,我遇到了同样的问题:我们有一个分布式体系结构,有许多简单的节点,每个节点在自己的JVM中都有一个单独的Jetty服务器。它们每个可以占用1-2MB,但至少要占用64MB。至于
类数据共享
,有些人并不这么认为。当两个应用程序共享相同的代码(即完全相同的Java字节代码)时,它们已经知道彼此代码的所有信息。数据(即实例数据)无法共享,至少不能有效地共享。我指的不是数据,而是代码。如果共享代码不在安全位置,如何确保字节不会被恶意修改?或者,如何确保内存中的类不会被恶意修改。这与攻击进程之间不共享的代码有何不同?如果虚拟机无法抵御此类攻击,那么安全风险不会改变。因为您涉及某种共享内存。您是对的,问题不在文件系统级别(这已经存在),但是当您添加此共享内存时,您需要能够确保其中的内容不允许跨进程漏洞。我指的是代码缓冲区,VM已经在其中存储JIT编译的Java代码,以及Java从jar文件加载字节代码时通过操纵字节代码可以进行的攻击。如果VM能够抵御这些攻击,那么在共享此代码缓冲区时就不会有额外的风险。