当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在Java中,是程序之间共享的静态类成员吗?》经验,为你挑选了3个好方法。

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

但整个JVM的实际工作原理是什么?对于我发布的每个Java程序,是否在单独的进程中有单独的JVM?在系统中运行的Java程序是否共享任何东西?操作系统和JVM实现之间是否存在差异?我可以让程序共享变量(即直接通过JVM而不是通常的IPC机制)吗?是否有更多异国情调的单进程JVM用于特殊目的?

一般来说,推荐的内容是关于JVM的内容吗?该规范?一些实现的源代码?网站?图书?



1> Miguel Ping..:

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

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

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

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

但整个JVM的实际工作原理是什么?对于我发布的每个Java程序,是否在单独的进程中有单独的JVM?在系统中运行的Java程序是否共享任何东西?

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

操作系统和JVM实现之间是否存在差异?我可以让程序共享变量(即直接通过JVM而不是通常的IPC机制)吗?是否有更多异国情调的单进程JVM用于特殊目的?

就像一张海报说的那样,像Terracota这样的项目为你提供了便利.这种共享的一般方法是分布式缓存.



2> Jon Skeet..:

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

在某些实现中,我相信它们可能共享一些资源(例如,JRE类的JITted代码的内存),但我不确定.我相信正在进行的工作是为了实现更多共享,但仍然是一种强有力的方式.(你真的不希望一个JVM崩溃影响其他人.)

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

我相信有关于JVM的书籍,但我不能推荐任何.你可能最好寻找HotSpot白皮书了解详细信息.这是一个非常好的起点.



3> mkoeller..:

如果您的主要兴趣是如何实例化静态类成员,那么您应该在类加载领域中搜索更多内容.

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

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

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有