Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java代码在linux中会导致分段错误吗?_Java_Linux_Segmentation Fault - Fatal编程技术网

java代码在linux中会导致分段错误吗?

java代码在linux中会导致分段错误吗?,java,linux,segmentation-fault,Java,Linux,Segmentation Fault,据说java在内存处理方面比C更安全。 在C语言中,访问无效指针很容易导致分段错误。现在我想知道java代码是否也会导致分段错误。 有人能给我举个例子吗?Java有一个执行本机代码(JNI)的接口。这样就可以调用用C编写的代码,从而使分段错误成为可能 JVM代码本身中的错误可能会导致分段错误,但这种情况相当罕见 对于纯Java,不允许。该语言设计为只允许指向有效地址或空地址的引用。在后者之后,您会得到一个NullPointerException。通常在普通Java程序中,您不会遇到这个问题。 但

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

Java有一个执行本机代码(JNI)的接口。这样就可以调用用C编写的代码,从而使分段错误成为可能

JVM代码本身中的错误可能会导致分段错误,但这种情况相当罕见


对于纯Java,不允许。该语言设计为只允许指向有效地址或空地址的引用。在后者之后,您会得到一个NullPointerException。

通常在普通Java程序中,您不会遇到这个问题。 但如果您使用类似于
sun.misc.Unsafe
的东西,则可能会导致分段错误。但这就是为什么
不安全
被称为
不安全
。通常情况下,您不必使用它,因此代码中不会出现这种问题

有关更多信息:

基于分段错误报告的错误,与
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上执行时,我得到以下输出:
Java运行时环境检测到致命错误:

pc=0x00007F05BDF004D27、pid=4145、tid=4147时的SIGSEGV(0xb)

JRE版本:OpenJDK运行时环境(10.0.2+13)(构建10.0.2+13-Ubuntu-1ubuntu0.18.04.4)

在Windows上,我认为它将是类似的输出,带有致命错误描述


祝大家好运

Java语言规范和Java虚拟机规范都没有提到分段错误是Java程序或JVM的行为。这是因为Java是一种特定于系统的东西(特定于Unix操作系统),而Java是可移植的。这些规范也没有将分段错误作为允许的行为。此外,java字节码的指定语义没有任何类似C或C++的语义。因此,JVM规范不允许纯Java代码导致分段错误

如果纯Java程序导致了分段错误,那么这将表明JVM本身存在错误。Linux上的JVM是否存在可能导致分段错误的错误?当然但是在这种情况下,说Java代码导致了分段错误是正确的吗?我认为不是;我会说“JVM中的bug”导致了分段错误

所以你的问题的答案是,学究式的,


Java也可以调用(实际上,这意味着C代码)。该C代码可能有bug,因此它执行的操作具有未定义的行为,从而导致分段错误。同样,迂腐的是,Java代码没有导致分段错误;我会说“本机代码中的错误”导致了分段错误。

实际上,我看不出什么更安全:C程序的进程因访问错误指针而终止,或者Java进程因无效指针而异常终止。在这两个系统中,您都可以捕获问题,但它真的可以在异常处理程序中修复吗?我认为Java增加的唯一安全性是,做“肮脏的事情”比在C语言中要困难得多。