Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.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中,程序之间是否共享静态类成员?_Java_Jvm - Fatal编程技术网

在Java中,程序之间是否共享静态类成员?

在Java中,程序之间是否共享静态类成员?,java,jvm,Java,Jvm,我想不,它们不是,因为每个进程当然都有自己的内存空间。 但是整个JVM是如何工作的呢?对于我启动的每个Java程序,在单独的进程中是否有单独的JVM?系统中运行的Java程序是否共享任何东西?OSs和JVM实现之间是否存在差异?我是否可以让程序共享变量(即直接通过JVM而不是通常的IPC机制)?是否有更多特殊用途的单进程JVM 一般来说,关于JVM的胆识有哪些值得推荐的读物?这个一些实现的源代码?网站?书籍?不,静态变量不在JVM之间。是的,您运行的每个Java应用程序都有一个单独的JVM进程

我想不,它们不是,因为每个进程当然都有自己的内存空间。

但是整个JVM是如何工作的呢?对于我启动的每个Java程序,在单独的进程中是否有单独的JVM?系统中运行的Java程序是否共享任何东西?OSs和JVM实现之间是否存在差异?我是否可以让程序共享变量(即直接通过JVM而不是通常的IPC机制)?是否有更多特殊用途的单进程JVM


一般来说,关于JVM的胆识有哪些值得推荐的读物?这个一些实现的源代码?网站?书籍?

不,静态变量不在JVM之间。是的,您运行的每个Java应用程序都有一个单独的JVM进程

在某些实现中,我相信它们可能共享一些资源(例如,JRE类的JITted代码的内存),但我不确定。我相信我们正在努力实现更多的共享,但仍然是以一种强有力的方式。(您并不希望一个JVM崩溃会影响其他JVM。)

不,不能让程序透明地共享变量


我相信有关于JVM的书,但我不能推荐任何一本。你最好去看看热点白皮书来了解这方面的细节。这是一个很好的起点。

你的假设是正确的。是的,每个JVM都是一个单独的进程。您可以在运行两个Java程序时打开任务管理器来确认这一点(按名称排序进程并查找Java.exe或javaw.exe)


可以使JVM相互连接(例如,使用本地套接字),但没有内置任何东西。

如果您主要关心静态类成员的实例化方式,则可能应该在类加载方面进行更多搜索

如果同一VM上的不同线程使用单独的类装入器,则它们可能有自己的静态类nember实例


这里的经典示例是将不同的web应用程序分开,尽管lib-jar可能对所有应用程序都是通用的。

取决于实现,但确实存在共享内容的方式。为了改变这一点,Sun(通过苹果)在虚拟机实例之间共享数据方面做了大量工作。有一个链接讨论了其中的一些内容

要实现任何类型的共享,都需要VM实现者来完成,作为程序员,您不能做任何事情来实现它


VM规范是,也有一些(较旧的)关于它的书。您还可以查看非常小的源代码。

如果您想在JVM之间共享变量,您可以查看集群产品,如。它们称自己为“网络连接内存”,并允许您使用复制技术在JVM之间共享对象引用

在Java中,是静态类成员 在程序之间共享

类由其全名和加载它的类加载器定义。如果同一个类位于同一个JVM进程中,并且两个程序通过同一个类加载器加载该类,那么静态成员将共享。类加载规则非常重要

我想不,他们不是, 因为每个过程都有它自己的 当然是内存空间

如果您使用两个单独的JVM启动两个应用程序,那么您是正确的。但以应用程序/servlet容器(如tomcat)为例:它们通过同一进程(tomcat主机进程)加载多个应用程序

但是整个JVM是如何实现的呢 真的有用吗?是否有单独的JVM 在每个Java的单独进程中 我启动的程序?做Java 在系统共享中运行的程序 有什么事吗

每次在命令行中键入
>java-cp..
时,您都在创建一个新进程。请记住,当您使用
fork=true
运行eclipse或调用AntJava任务时,您也在创建新的进程

OSs和OSs之间有区别吗 JVM实现?我能做些什么 程序共享变量(即。 直接通过JVM,而不是 通常的IPC机制?有 更奇特的单进程JVM 特殊目的


正如一张海报所说,有像Terracota这样的项目可以为您提供便利。这种共享的一般方法是分布式缓存。

继续Kevin提到的内容,我知道没有JVM实现允许您在JVM实例之间共享静态变量。正如前面的回答(正确地)所述,每个JVM实例都是它自己的进程

Terracotta(这是一种集群技术,而不是JVM)允许跨JVM进程边界任意共享对象实例,包括共享静态变量。因此被称为“网络连接内存”。出于所有目的,当在JVM进程中使用Terracotta技术时,所有虚拟机中的所有线程的行为都好像它们都在看一个大型共享堆。(当然需要注意的是,由于这在物理上是不可能的,Terracotta通过复杂的共享和复制算法来管理它,这些算法涉及网络io来移动数据,因此有时延迟和吞吐量无法与本机内存访问相比)


在Terracotta网站的烹饪书部分有大量的例子——我建议您从Hello开始,了解它是如何工作的

+1对于类加载器,这决定了静态变量的范围。但这并不特定于线程,因为类加载器即使在单个执行线程上也可以更改。在JEE和OSGi环境中非常常见。回答很好。谢谢:)