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。
添加回答
舉報