unsafe原本的英文意思就是不安全的、危險的。在java中的角色一樣也是不安全的、危險的。它是在java包中的sun.msic,官方不建議使用,由於它能直接操做底層JVM,而且能夠修改內存,用很差的話可能直接會致使服務器崩潰,可是在netty、hadoop等開源框架中獲得了很好的運用,例如netty中運用unsafe進行無鎖化操做。另外在java的NIO中也對unsafe有很好的運用,利用unsafe在內存中和直接開闢大塊的堆外內存進行緩存和通訊,可是若是你操做不當很容易引發問題,由於它不在jvm中,因此沒有邊界檢查這一項。java
1.unsafe是單例的,全局惟一,經過源碼咱們就能明白緩存
這裏也能夠看到,只有主類加載器加載的類才能獲得unsafe實例,普通調用就會拋SecurityException異常。安全
2.要想用unsafe,首先得獲取到unsafe實例,怎麼獲取到這個實例呢,網上的方法有不少,我習慣用反射,以下圖:服務器
3.unsafe的功效框架
3.1對象實例化jvm
據我所知你們知道的對象實例化一般是用new 或者 反射,在這裏用unsafe去建立對象實例,具體如何建立以下圖函數
這裏經過unsafe造一個實例,這樣在建立的過程當中跳過構造函數,在有跳過構造函數的需求的話能夠考慮用unsafe。oop
3.2修改jvm內存netty
這裏能夠到jvm中找到某一字段在jvm內存中的物理地址,而後進行替換,具體操做以下圖對象
(未完,待續!)