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

标签 java jvm

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

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

一般来说,关于 JVM 的内容有哪些值得推荐的读物? spec ?一些实现的源代码?网站?书?

最佳答案

In Java, are static class members shared among programs?

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

I imagine that no, they aren't, because every process has its own memory space, of course.

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

But how does the whole JVM thing actually work? Is there a separate JVM in a separate process for every Java program that I launch? Do Java programs running in a system share anything at all?

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

Are there differences between OSs and JVM implementations? Can I make programs share variables (i. e. directly through the JVM rather than the usual IPC mechanisms)? Are there more exotic one-process JVMs for special purposes?

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

关于java - 在Java中,静态类成员是否在程序之间共享?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/686079/

相关文章:

java - IJVM ILOAD 指令未加载正确的值

java - 在 Windows 上的 Spark-Submit 中将多个 -D 参数传递给 driver-java-options

java - 使用 OpenCV 将多张图像合并为一张图像

java - 在 Eclipse 中查看 gcmv 使用的堆数量?

java - Java如何保留/使用内存?

java - JVM 是否优化别名变量?

java - 如何用 Java 编写正确的微基准测试?

java - 无法解析引用本地 ejb-ref

java - 多个监听器的 KafkaListener ConsumerConfig AUTO_OFFSET_RESET_DOC 最早

java-当我尝试使用 xstream 将 xml 响应转换为 pojo 时出错