3 回答
TA贡献1155条经验 获得超0个赞
通常在普通的Java程序中,您没有这个问题。但是,是的,如果您使用类似的东西可能会导致分段错误。但是,这就是为什么被称为.通常,您不必使用它,因此代码中就不会有此问题。sun.misc.UnsafeUnsafeUnsafe
有关详细信息:sun.misc.Unsafe 记录在哪里?
基于带有 https://github.com/eclipse/openj9/issues/4153 分段错误报告的错误sun.misc.Unsafe
下面是一个如何测试的示例:
import java.lang.reflect.Field;
import sun.misc.Unsafe;
public class MainClass {
public static void main(String[] args)
throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
theUnsafe.setAccessible(true);
Unsafe unsafe = (Unsafe) theUnsafe.get(null);
long ten = 10;
byte size = 1;
long mem = unsafe.allocateMemory(size);
//Put here the wrong address!!!
unsafe.putAddress(1, ten);
//With this will work:
//unsafe.putAddress(mem, ten);
long readValue = unsafe.getAddress(mem);
System.out.println("result: " + readValue);
}
}
当我在Ubuntu 18.04上执行时,我得到这个输出:A fatal error has been detected by the Java Runtime Environment:
SIGSEGV (0xb) at pc=0x00007f05bdf04d27, pid=4145, tid=4147
JRE version: OpenJDK Runtime Environment (10.0.2+13) (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.4)
在Windows上,我认为它将是具有致命错误描述的类似输出。
祝大家好运!
TA贡献1829条经验 获得超6个赞
Java 语言规范和 Java 虚拟机规范都没有提到分段错误是 Java 程序或 JVM 的行为。这是因为“分段错误”是系统特定的东西(特定于Unix操作系统),而Java意味着可移植。这些规范也没有给出任何像分割错误这样的错误作为允许的行为。此外,Java字节码的指定语义没有类似于C或C++的“未定义行为”的内容。因此,JVM 规范不允许纯 Java 代码导致分段错误。
如果纯Java程序导致分段错误,则表明JVM本身存在错误。Linux 上的 JVM 是否存在可能导致分段错误的 bug?答案是肯定的。但是在这种情况下,说Java代码导致了分段错误是正确的吗?我认为不是。我会说“JVM中的错误”导致了分段错误。
因此,从学理上讲,你的问题的答案是否定的。
Java也可以调用“本机代码”(在实践中意味着C代码)。该 C 代码可能存在 bug,因此它执行的行为未定义,从而导致分段错误。同样,从学理上讲,Java代码没有导致分段错误;我会说“本机代码中的错误”导致了分段错误。
TA贡献1878条经验 获得超4个赞
Java有一个用于执行本机代码(JNI)的接口。这样就可以调用用C编写的代码,从而使分段错误成为可能。
JVM代码本身中的错误可能会导致分段错误,但这些错误相当罕见。
使用纯Java,没有。该语言旨在仅允许指向有效地址或 null 的引用。在后者之后,您将获得NullPointerException。
添加回答
举报
