首页 > 解决方案 > 当内存损坏时,Java 中的相同引用/实例变量会发生什么?

问题描述

假设有两个变量指向同一个实例:

var obj1 = new Object();
var obj2 = obj1;

是否有可能obj1由于内存位翻转(例如硬件故障)而指向错误的内存地址?

so obj1指向无效的内存地址,但obj2仍然有效,并指向创建的“new Object()”。

标签: java

解决方案


不在“Java语言”中。语言规范假设机器正常工作,我假设“位翻转”是指硬件故障的类型。

如果您开始考虑诸如 RAM 的随机故障、宇宙射线、来自其他维度的无所不能的存在等因素 - 那么一切皆有可能,但应该从问题中删除“Java”标签。

更新(在另一个答案下的一些评论之后)

我说“Java 语言”,因为这个问题将 Java 与 JVM 混为一谈。Java 程序可以在多个 VM 上运行 - 并且可以以不同的方式进行编译。Dalvik 和 JVM 很常见(现在很难说哪一个更常见),但是仍然有很多代码使用两代 GWT 编译器 TeaVM、RoboVM。GraalVM 变得越来越流行。

Java 规范(又名 Java 语言)不受物理世界的影响。它是一种语言的理想。询问它是否会受到硬件故障的影响,就像询问一米是否可以短于 100 厘米,如果它是由劣质材料制成的。

另一方面,Java 的实际实现会受到硬件故障的影响,但这些故障不是 Java 特定的。在大多数情况下,问题中描述的“变量”的Java构造与低级实现之间甚至不存在映射(将有一个堆栈,一个寄存器,或者闭包中的一个键,或者它可能会完全优化)。

所以,这个问题要么没有意义,要么与 Java 无关。


推荐阅读