Java代码会导致Linux中的分段错误吗?

据说java在内存处理方面比C更安全。在C中,很容易通过访问无效指针来引起分段错误。现在我想知道java代码是否也会导致分割错误。有人可以给我举个例子吗?


跃然一笑
浏览 168回答 3
3回答

白衣非少年

通常在普通的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=4147JRE version: OpenJDK Runtime Environment (10.0.2+13) (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.4)在Windows上,我认为它将是具有致命错误描述的类似输出。祝大家好运!

肥皂起泡泡

Java 语言规范和 Java 虚拟机规范都没有提到分段错误是 Java 程序或 JVM 的行为。这是因为“分段错误”是系统特定的东西(特定于Unix操作系统),而Java意味着可移植。这些规范也没有给出任何像分割错误这样的错误作为允许的行为。此外,Java字节码的指定语义没有类似于C或C++的“未定义行为”的内容。因此,JVM 规范不允许纯 Java 代码导致分段错误。如果纯Java程序导致分段错误,则表明JVM本身存在错误。Linux 上的 JVM 是否存在可能导致分段错误的 bug?答案是肯定的。但是在这种情况下,说Java代码导致了分段错误是正确的吗?我认为不是。我会说“JVM中的错误”导致了分段错误。因此,从学理上讲,你的问题的答案是否定的。Java也可以调用“本机代码”(在实践中意味着C代码)。该 C 代码可能存在 bug,因此它执行的行为未定义,从而导致分段错误。同样,从学理上讲,Java代码没有导致分段错误;我会说“本机代码中的错误”导致了分段错误。

UYOU

Java有一个用于执行本机代码(JNI)的接口。这样就可以调用用C编写的代码,从而使分段错误成为可能。JVM代码本身中的错误可能会导致分段错误,但这些错误相当罕见。使用纯Java,没有。该语言旨在仅允许指向有效地址或 null 的引用。在后者之后,您将获得NullPointerException。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java