亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java代碼會導致Linux中的分段錯誤嗎?

Java代碼會導致Linux中的分段錯誤嗎?

躍然一笑 2022-09-07 21:04:02
據說java在內存處理方面比C更安全。在C中,很容易通過訪問無效指針來引起分段錯誤?,F在我想知道java代碼是否也會導致分割錯誤。有人可以給我舉個例子嗎?
查看完整描述

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上,我認為它將是具有致命錯誤描述的類似輸出。


祝大家好運!


查看完整回答
反對 回復 2022-09-07
?
肥皂起泡泡

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代碼沒有導致分段錯誤;我會說“本機代碼中的錯誤”導致了分段錯誤。


查看完整回答
反對 回復 2022-09-07
?
UYOU

TA貢獻1878條經驗 獲得超4個贊

Java有一個用于執行本機代碼(JNI)的接口。這樣就可以調用用C編寫的代碼,從而使分段錯誤成為可能。

JVM代碼本身中的錯誤可能會導致分段錯誤,但這些錯誤相當罕見。

使用純Java,沒有。該語言旨在僅允許指向有效地址或 null 的引用。在后者之后,您將獲得NullPointerException。


查看完整回答
反對 回復 2022-09-07
  • 3 回答
  • 0 關注
  • 136 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號