簡述Unsafe使用

2021-03-05 跳動的數據

Unsafe是位於sun.misc包下的一個類,主要提供一些用於執行低級別、不安全操作的方法,如直接訪問系統內存資源、自主管理內存資源等,這些方法在提升Java運行效率、增強Java語言底層資源操作能力方面起到了很大的作用。但由於Unsafe類使Java語言擁有了類似C語言指針一樣操作內存空間的能力,這無疑也增加了程序發生相關指針問題的風險。在程序中過度、不正確使用Unsafe類會使得程序出錯的概率變大,使得Java這種安全的語言變得不再「安全」,因此對Unsafe的使用一定要慎重。

使用Unsafe申請的內存是對外內存。

示例介紹如何使用

 public static void main(String[] args) throws Exception {
Num num1 = new Num(); System.err.println("new關鍵字創建: n=" + num1.getN());
Num num2 = Num.class.newInstance(); System.err.println("反射創建: n=" + num2.getN()); Unsafe unsafe = getUnsafe(); Num num3 = (Num) unsafe.allocateInstance(Num.class); System.err.println("反射創建: n=" + num3.getN());
Field nField = num3.getClass().getDeclaredField("n"); unsafe.putInt(num3, unsafe.objectFieldOffset(nField), 2);
System.err.println("Unsafe 修改後的值: n=" + num3.getN());

byte[] bytes = getClazzContent(); Class numClazz = unsafe.defineClass(null, bytes, 0, bytes.length, null, null); Object result = numClazz.getMethod("getN").invoke(numClazz.newInstance());
        System.err.println("Unsafe 加載Num.class文件: n=" + result); }

public static Unsafe getUnsafe() { Field f; Unsafe unsafe; try { f = Unsafe.class.getDeclaredField("theUnsafe"); f.setAccessible(true); unsafe = (Unsafe) f.get(null); } catch (Exception e) { throw new RuntimeException("initial the unsafe failure..."); } return unsafe; }
public static byte[] getClazzContent() throws IOException { File f = new File("/usr/local/gitrep/banyan/target/classes/org/banyan/concurrent/base/UnsafeDemo$Num.class"); try (FileInputStream fis = new FileInputStream(f)) { byte[] bytes = new byte[fis.available()]; fis.read(bytes); return bytes; } }

public static class Num { private int n;
public Num() { this.n = 1; }
public int getN() { return n; }
public void setN(int n) { this.n = n; } }

運行結果如下

new關鍵字創建: n=1反射創建: n=1Unsafe創建: n=0Unsafe 修改後的值: n=2Unsafe 加載Num.class文件: n=1

從運行結果可以看出,Unsafe的使用,後續在詳細介紹

相關焦點

  • Go語言中 Unsafe 的用法
    在我們想繞過類型限制的時候可以使用它:var k uint8 = *(*uint8)(unsafe.Pointer(&i))println(k) 原始值現在被解釋為 uint8,而不是用原來聲明的類型的值(也可以通過強制類型轉換把 int8 轉為 uint8 ——譯者注)。
  • Unsafe函數是什麼?
    不過儘管如此,JVM 還是開了一個後門,JDK 中有一個類 Unsafe,底層是使用C/C++寫的,它提供了硬體級別的原子操作。Unsafe為我們提供了訪問底層的機制,這種機制僅供java核心類庫使用,而不應該被普通用戶使用。
  • 深度解密Go語言之unsafe
    ,大量使用。Go 還有非類型安全的指針,這就是 unsafe 包提供的 unsafe.Pointer。在某些情況下,它會使代碼更高效,當然,也更危險。unsafe 包用於 Go 編譯器,在編譯階段使用。從名字就可以看出來,它是不安全的,官方並不建議使用。我在用 unsafe 包的時候會有一種不舒服的感覺,可能這也是語言設計者的意圖吧。
  • Costs of Unsafe Abortions
    A new study looked at the global cost of unsafe abortions, including the many women who are treated for complications of botched procedures.
  • Java中的Unsafe
    答案就是通過反射來獲取Unsafe:public Unsafe getUnsafe() throws IllegalAccessException { Field unsafeField = Unsafe.class.getDeclaredFields()[0]; unsafeField.setAccessible(true); Unsafe
  • 【厚積薄發】開啟Allow unsafe code的影響
    UWA 問答社區:answer.uwa4d.comUWA QQ群2:793972859(原群已滿員)本期目錄:Q:最近項目引進幾個插件,以及學習別人的插件,代碼中用到了unsafe關鍵字,需要再project settings中勾選Allow unsafe
  • 硬核解讀:為什麼Rust的Unsafe關鍵字有效?
    所以我的目標很簡單:我想概要的介紹一下為什麼 Rust 的unsafe關鍵字有效,而在 C/C++ 中類似的方法卻行不通。和其他許多人一樣,我在日常工作中也用到 C 語言。它不是一種糟糕的語言,我喜歡它,就像我喜歡使用彙編或其他深奧的語言編碼一樣,我將其看成是一個有趣的、具有挑戰性的謎題。我不能說我喜歡維護 C 語言代碼,我也不認為任何人會喜歡長時間這樣做。
  • 【java基礎】並發包unsafe類概述
    過度的使用Unsafe類會使得出錯的機率變大,因此Java官方並不建議使用的,官方文檔也幾乎沒有。所以,正常情況下開發者無法直接使用Unsafe ,如果需要使用它,則需要利用反射:private static Unsafe getUnsafe(){ try { Field field = Unsafe.class.getDeclaredField("theUnsafe"); field.setAccessible(true
  • Go指針的使用限制和突破之路
    網管覺得正是因為功能強大同時伴隨著操作不慎讀寫了錯誤的內存地址即會造成的嚴重後果所以 Go 語言的設計者才會把這些功能放在 unsafe 包裡。其實也沒有想得那麼不安全,掌握好了使用得當還是能帶來很大的便利的,在一些偏向底層的源碼中 unsafe 包使用的頻率還是不低的。對於勵志成為高階 Gopher 的各位,這也是一項必不可少需要掌握的技能啦。
  • 2020年廣東醫療衛生結構化面試資料:簡述簡易呼吸器的使用
    廣東衛生人才網同步廣東衛生人才網備考資料信息:2020年廣東醫療衛生結構化面試資料:簡述簡易呼吸器的使用,請考生多加關注。更多廣東醫療衛生面試資料,廣東醫療衛生考試,廣東人事考試的內容,請關注廣東衛生人才網備考資料頻道/廣東人事考試網!
  • 簡述吊瓶電熨鬥使用中的注意事項有哪些 吊瓶電熨鬥如何除水垢
    在日常生活中,電熨鬥是我們經常會使用的家電產品,對於電熨鬥的使用,大家要注意一下方法,可以根據電熨鬥的類型來選擇合適的使用方式,吊瓶電熨鬥是很常見的一種類型,要注意正確的使用方法,那麼簡述吊瓶電熨鬥使用中的注意事項有哪些?吊瓶電熨鬥如何除水垢?來了解一下吧。
  • 並發類 AtomicLong 使用入門及源碼詳解
    API 直接查閱 JDK DocAtomicLong 與 Long 的區別這兩個對象之間存在顯著差異,雖然最終結果是相同的,但它們肯定是非常不同的,並且在非常不同的情況下使用。Long 在以下情況下使用基本Long對象:你只想處理對象而不是 primitives(有點工作)AtomicLong 您在以下情況下使用AtomicLong:Long本身不允許線程互操作,因為兩個線程都可以看到並更新相同的值,但是使用AtomicLong,
  • PWN:unsafe unlink
    how2heap 這個程序展示了怎樣利用 free 改寫全局指針 chunk0_ptr 達到任意內存寫的目的,即 unsafe unlink。所以說可以讀取任意長度的數據,這裡也就是後面我們溢出所使用的辦法。這裡我想在開始就改寫,但是不行,原因大概是一開始下面的那個 chunk 沒有申請,溢出的那塊地址沒法寫入?
  • Golang slice 使用技巧
    + 操作在大量拼接時性能也是很差, 不過小字符串少量拼接效果很理想,builder 往往性能不如 buffer 特別是在較短字符串拼接上,實際 builder 和 buffer 實現原理非常類似,builder 在轉成字符串時使用了 unsafe 減少了一次內存分配,因為小字符串因為擴容機制不如 buffer 靈活,所以性能有所不如,大字符串降低一次大的內存分配就顯得很明顯了。
  • New Zealand teacher: I want to go back but not if it's unsafe
    She said she wants to go back, but not in an unsafe environment and is incredibly grateful to friends that have supported her with places to stay and wifi connections.
  • 阿里面試官:你了解Java Unsafe類嗎?
    但凡事不是絕對的,使用Unsafe程式設計師就可以操作內存,因此可能帶來一個安全隱患。  這篇文章是就快速學習下sun.misc.Unsafe的公共API和一些有趣的使用例子。  1、Unsafe 實例化  在使用Unsafe之前我們需要先實例化它。
  • 簡述橫軸式與縱軸式掘進機的區別?
    我的煤炭網>新聞>綜合信息>煤礦知識>簡述橫軸式與縱軸式掘進機的區別? 簡述橫軸式與縱軸式掘進機的區別?   煤安中心 發布日期:2020-05-08 09:24:05 新聞歸檔 簡述橫軸式與縱軸式掘進機的區別?
  • 簡述羊毛的物理性質指標都有哪些
    簡述羊毛的物理性質指標都有哪些 2018-12-28 11:15:57 來源:全球紡織網 簡述羊毛的物理性質指標都有哪些?
  • RIP路由協議特點簡述
    RIP路由協議特點簡述 RIP路由協議的特點我們在這篇文章中再來為大家鞏固一下,包括配置簡單,相互兼容,小巧方便等等。RIP RIP(路由信息協議)是路由器生產商之間使用的***個開放標準,是最廣泛的路由協議,在所有IP路由平臺上都可以得到。當使用RIP時,一臺Cisco路由器可以與其他廠商的路由器連接。RIP有兩個版本:RIPv1和RIPv2,它們均基於經典的距離向量路由算法,***跳數為15跳。
  • 教育基礎知識教師招聘考試62個簡述題及答案
    41簡述教育立法的社會特徵?答:1)教育立法的歷史性2)教育立法的國別性3)教育立法的層級性。42簡述教育法規的縱向結構?6)聘任教師及其他員工,事實獎勵者處分的權利7)管理、使用本單位的設施和經費的權利8)拒絕任何組織和個人對教育教學活動的非法幹涉的權利9)法律、法規規定的其他權利。47簡述履行的義務?