我想,不,它们不是,因为每个进程当然都有自己的内存空间.
但整个JVM的实际工作原理是什么?对于我发布的每个Java程序,是否在单独的进程中有单独的JVM?在系统中运行的Java程序是否共享任何东西?操作系统和JVM实现之间是否存在差异?我可以让程序共享变量(即直接通过JVM而不是通常的IPC机制)吗?是否有更多异国情调的单进程JVM用于特殊目的?
一般来说,推荐的内容是关于JVM的内容吗?该规范?一些实现的源代码?网站?图书?
在Java中,是程序之间共享的静态类成员吗?
类由其全名和加载它的类加载器定义.如果同一个类在同一个JVM进程中,并且两个程序通过相同的类加载器加载该类,则静态成员将被共享.类加载规则非常重要.
我想,不,它们不是,因为每个进程当然都有自己的内存空间.
如果您使用两个单独的JVM来启动两个应用程序,那么您是对的.但是以应用程序/ servlet容器为例,例如tomcat:它们通过相同的进程(tomcat主机进程)加载多个应用程序.
但整个JVM的实际工作原理是什么?对于我发布的每个Java程序,是否在单独的进程中有单独的JVM?在系统中运行的Java程序是否共享任何东西?
每次>java -cp...
在命令行键入时,都会创建一个新进程.请记住,当您运行eclipse或调用ant java任务时,fork=true
您也在创建新进程.
操作系统和JVM实现之间是否存在差异?我可以让程序共享变量(即直接通过JVM而不是通常的IPC机制)吗?是否有更多异国情调的单进程JVM用于特殊目的?
就像一张海报说的那样,像Terracota这样的项目为你提供了便利.这种共享的一般方法是分布式缓存.
不,JVM之间不存在静态变量.是的,您运行的每个Java应用程序都有一个单独的JVM进程.
在某些实现中,我相信它们可能共享一些资源(例如,JRE类的JITted代码的内存),但我不确定.我相信正在进行的工作是为了实现更多共享,但仍然是一种强有力的方式.(你真的不希望一个JVM崩溃影响其他人.)
不,你不能让程序透明地共享变量.
我相信有关于JVM的书籍,但我不能推荐任何.你可能最好寻找HotSpot白皮书了解详细信息.这是一个非常好的起点.
如果您的主要兴趣是如何实例化静态类成员,那么您应该在类加载领域中搜索更多内容.
如果它们使用单独的类加载器,则同一VM上的不同线程可能具有自己的静态类nember实例.
这里的经典示例是Apache Tomcat将不同的Web应用程序分开,尽管lib jar可能对所有应用程序都是通用的.