- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Java 内存模型提供 DRF 保证(数据竞争自由),这意味着在宽松的 Java 内存模型下执行无数据竞争的程序将提供与顺序一致执行相同的行为。我有以下问题:a)给定一个活跃的程序,编译器(非常具体的任何jvm实现)是否进行延迟集分析/线程逃逸分析等以找出需要插入的栅栏指令以使其无竞争?还是 JIT 是根据它在哪里执行的?
b) 如果编译器做到了(在本例中为 jvm),为什么我们不能只编写有竞争性的程序,因为编译器无论如何都会将其转换为无竞争性程序?如果编译器有任何办法做到这一点(通过栅栏插入使其无竞争),怎么能(有意地)编写活泼的程序,比如 java 中并发数据结构的某些实现?
c) 或者第三种可能性,即 jvm 本身不会将 racy 转换为 race-free 程序,但存在其他分析可以为我们做到这一点。是这样吗?
最佳答案
Given a racy program, does compiler (to be very specific any jvm implementation) do the delay set analysis/thread escape analysis etc to find out the fence instructions that need to be inserted to make it race-free? or doest JIT do it based on where is it getting executed?
内存栅栏指令特定于架构的指令集。它们不是 JVM 指令集中的等效指令。因此,实际上是 JVM/JIT 向处理器发出了栅栏指令。
If compiler does it (jvm in this case) why cant we just write racy program because compiler is anyway going to convert it into race-free program? And if compiler is any way going to do it (make it race-free by fence insertion), how can one write racy programs(intentionally), like some implementations of concurrent data structures in java?
编译器只会确保在生成字节代码时,对 JVM 中的变量执行的所有操作都遵守 Java 内存模型中指定的规则。具体来说,在优化领域,编译器可以自由优化任何指令集,只要它不影响 Action 之间必须存在的发生前关系或 Action 之间的同步顺序。例如,编译器不会重新组织对 volatile 变量的读写。它还将确保在进入或离开 protected (同步)代码区域时不会违反先行发生关系。
因此,编译器会将“有竞争性”的程序转换为无竞争性程序的说法是不正确的。事实上,假定为无竞争(但不是在 Java 内存模型下)的程序在优化后可能会变成“竞争”程序。
Java 中数据结构的并发实现依赖于 Java 内存模型提供的保证。具体来说,这是从 Java 5 修订后的 Java 内存模型,其中准确指定了 volatile 变量的读写之间的发生前关系。 java.util.concurrent
包中的 ConcurrentXXX 类在很大程度上依赖于 volatile 读取的 promise 行为来确保无竞争行为。在 Java 内存模型下,对 volatile 变量的写入保证在读取之前发生,如果这是程序顺序的话;简而言之, volatile 读取将始终检索变量中数据的最准确版本。并发类利用它来确保数据结构可以由单个线程更新,同时由多个其他线程读取(在任何其他情况下,都会存在竞争条件)。
Or third possibility that jvm itself does not convert racy to race-free program but there exists other analysis that can do it for us. Is it the case?
JVM 发出内存栅栏指令。它不执行任何“racy”程序到“race-free”程序的转换。如果编译器生成的字节码遵循 Java 内存模型,那么 JVM/JIT 将在必要时发出内存栅栏指令 - 当读取/写入 volatile 变量、获取或释放对象上的监视器等时。
冒着重复我自己的风险,JVM 和编译器都不会将“racy”程序转换为无竞争程序,反之亦然。任何相反的行为都是 Java 内存模型或 JVM 中的错误。您需要通过了解程序顺序、同步顺序和 happens-before 顺序,将程序编写为无竞争程序,编译器和 JVM 将保证在运行时确保它。
我鼓励您阅读 this article at InfoQ ,有关 JVM 如何发出内存栅栏指令并保证 Java 内存模型做出的 promise 的更多详细信息。
关于java - JVM/JIT 的栅栏指令插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6668597/
是否可以复制一个完整的 JVM,并且在故障转移的情况下只需将负载转移到复制的 JVM 上? 如果是,那我们该怎么做呢? 最佳答案 如果您的应用程序是 Web 应用程序,请阅读“集群”和“负载平衡”。大
我读了下面的话,但我想知道它们之间的区别...... JVM 规范、JVM 实现、JVM 运行时 最佳答案 JVM 规范:描述 JVM 应如何运行的文档。 JVM 实现:基于 JVM 规范的 JVM
我目前有四个不同的 java 应用程序,它们由 .bat 文件启动的 jar 运行,这些文件位于 Windows XP Embedded 开始菜单的 starup 文件夹中。我还启动了 Firefox
有人能给我一些关于强制 64 位 jvm 作为 32 位 jvm 运行的想法吗? 我需要为蓝牙连接编写一个 jse 桌面应用程序。为此,我需要实现 Bluecove jar 。它只有 32 位文件。所
我看到过关于这个问题的多条评论——有人说是,有人说不是,许多答案模棱两可。任何人都可以用更简单的术语描述它所在的位置吗?在一篇文章中,我什至看到有人说它与类加载器加载类的类内存共享相同的内存位置 -
我正在寻找所有可能的 jvm 退出代码的完整列表(不是 java System.exit(x))。我使用搜索引擎唯一能找到的是 SIGTERM 退出代码列表:http://journal.thobe.
为了监视任何正常的 Java 进程 JVM,我们可以使用 Attach API。是否有可用于监控 WebSphere JVM 的 API? 最佳答案 您可以使用 PMI(性能监控基础设施)来监控 JV
这个问题在这里已经有了答案: 8年前关闭。 Possible Duplicate: Java - C-Like Fork? 我想知道如何从 JDK fork 子 JVM,甚至有可能这样做吗? 一些框架
JVM 上的哪些图灵完备语言实现不使用 JVM 堆栈作为调用堆栈? (我问是因为我想在同一个线程中实现 Scala 和另一种语言之间的协程。) 最佳答案 闪蝶 SISC(方案代码的第二解释者) 曾经不
我看到here除了 Java 之外,还有很多语言可以在 JVM 上运行。我对在 JVM 中运行的其他语言的整个概念有些困惑。所以: 为 JVM 使用其他语言有什么优势? 为 JVM 编写语言/编译器需
我已经运行了 straced JVM (OpendJDK 11): strace -e trace=mmap java -Xms8192m Main 输出是: mmap(NULL, 8192, PRO
我已经运行了 straced JVM (OpendJDK 11): strace -e trace=mmap java -Xms8192m Main 输出是: mmap(NULL, 8192, PRO
我编写了一个简单的数独求解器。为了粗略测试性能,我使用简单的 System.currentTimeMillis 调用。 我在文本文件中准备了一组初始数独配置。该程序读取该文件并解决每个数独配置。运行测
JVM 被广泛使用:Scala、Groovy、Jython 等。我听说它被描述为“卓越”、“出色”和“严重低估”。为什么? 更具体地说,是什么让 JVM 独一无二?随着所有资金投入 .NET,或者 C
这个问题在这里已经有了答案: 10年前关闭。 Possible Duplicate: Are there any Java VMs which can save their state to a fi
想象一下 6-7 台服务器的设置都完全相同Java 版本“1.6.0_18”OpenJDK 运行时环境 (IcedTea6 1.8) (fedora-36.b18.fc11-i386)OpenJDK
(如有错误请指正) 我了解到,当您通过发出 java 命令来运行 java 程序时, java MyProg 程序将在新的 JVM 上运行。 什么将程序加载到新的 JVM 中?是生成新线程的 JRE
我们有一个使用 JNI 的桌面应用程序偶尔会导致 JVM 崩溃。幸运的是,JVM 会生成一个 hs_err_pidXXXX.log 文件,这对于调试此类错误非常有用。然而,它似乎总是转到当前工作目录,
我在命令提示符下运行一个程序集 jar 文件并得到下面的异常。并导致终止。 Uncaught error from thread [ccp-akka.persistence.dispatchers.d
一、什么是Java虚拟机 虚拟机:指以软件的方式模拟具有完整硬件系统功能、运行在一个完全隔离环境中的完整计算机系统 ,是物理机的软件实现。常用的虚拟机有VMWare,Visual Box,Java
我是一名优秀的程序员,十分优秀!