日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

sun.misc.Unsafe和堆外内存

發(fā)布時(shí)間:2023/12/3 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sun.misc.Unsafe和堆外内存 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

sun.misc.Unsafe類允許您執(zhí)行許多Java中不應(yīng)該做的事情,但是在非常特殊的情況下仍然有用。 必須在99%的時(shí)間避免這種情況,但是在極少數(shù)情況下,這是唯一有意義的解決方案。

這篇文章考慮了它在OpenHFT中的使用方式以及我希望在Java 9中看到的功能。特別地,可以通過這種方式完成訪問大量?jī)?nèi)存而不影響GC的工作。 只有在Java中才能通過這種方式在進(jìn)程之間共享內(nèi)存,而不會(huì)產(chǎn)生大量開銷。

分配和釋放堆內(nèi)存。

public native long allocateMemory(); public native void freeMemory(long address);

這兩種方法允許您分配任何大小的堆外內(nèi)存。 它不限于Integer.MAX_VALUE字節(jié),您會(huì)獲得原始內(nèi)存,可以在其中應(yīng)用邊界檢查。 例如,Bytes.writeUTF(String)計(jì)算編碼字符串的長(zhǎng)度,并檢查整個(gè)字符串是否適合一次(而不是每個(gè)字節(jié))。

Java-Lang使用與DirectByteBuffer用來確保釋放內(nèi)存相同的內(nèi)部Cleaner類。 理想情況下,這不會(huì)那么內(nèi)部。

原始訪問內(nèi)存

public native Xxx getXxx(Object, long offset); // intrinsic public native void putXxx(Object, long offset);// intrinsic

在這兩種情況下,處理堆外內(nèi)存時(shí),Object均為null,并且偏移量只是地址。 這使您可以使用針對(duì)JVM的單個(gè)機(jī)器代碼指令來執(zhí)行RAW內(nèi)存訪問,這些指令會(huì)威脅到它們作為內(nèi)在函數(shù)。 這顯著提高了內(nèi)存訪問的性能。

這種原始方法的問題在于,您必須自己管理數(shù)據(jù)結(jié)構(gòu)中字段的布局。 Java-Lang庫(kù)通過允許您定義getter和setter的接口(甚至對(duì)于String和enums等對(duì)象類型)來解決此問題,它將在運(yùn)行時(shí)生成實(shí)現(xiàn)。 即,您可以訪問getter / setter,而無(wú)需知道“對(duì)象”已脫離堆。

線程安全訪問內(nèi)存

public native Xxx getVolatileXxx(Object, long offset); // intrinsic public native void putOrderedXxx(Object, long offset); // intrinsic

這兩種方法使您可以將惰性字段與惰性集一起使用。 對(duì)于設(shè)置線程,惰性設(shè)置速度更快,但是如果設(shè)置得太快,則可能導(dǎo)致同一線程讀取舊值。 解決方案是不要讀取您剛剛編寫的值。

當(dāng)在進(jìn)程之間共享數(shù)據(jù)時(shí),這些方法特別有用。

CAS操作

public native boolean compareAndSwapXxxx(Object, long offset, Xxx expected, Xxx setTo) // intrinsic

此方法對(duì)于構(gòu)建鎖定堆至關(guān)重要。 特別是在進(jìn)程之間以線程安全的方式共享數(shù)據(jù)的最有效方法。 在我對(duì)Haswell i7-4500處理器進(jìn)行的測(cè)試中,同一臺(tái)計(jì)算機(jī)上兩個(gè)進(jìn)程的往返延遲通常是這樣。

TCP協(xié)議 – 9微秒。
文件鎖 – 5.5微秒。
中國(guó)科學(xué)院 – 0.12微秒。
有序?qū)? – 0.02微秒(半往返,如果可以使用此模式)

堆對(duì)象分配

public native Object allocateInstance(Class clazz);

在反序列化一個(gè)類時(shí),您希望按照序列化時(shí)的方式重新構(gòu)造該類中的值。 如JEP 187:序列化2.0所述,這不適用于當(dāng)前的構(gòu)造函數(shù),一種解決方法是完全避免構(gòu)造函數(shù),并創(chuàng)建實(shí)例而不調(diào)用實(shí)例。 這在很大程度上取決于信任您擁有的數(shù)據(jù),但是它具有易于使用的優(yōu)點(diǎn),并且不假設(shè)您擁有哪些構(gòu)造函數(shù)。

結(jié)論

經(jīng)常注意到,在沒有網(wǎng)絡(luò)開銷的情況下,嵌入式數(shù)據(jù)庫(kù)可以在延遲方面勝過分布式數(shù)據(jù)庫(kù)。 我相信下一代低延遲數(shù)據(jù)庫(kù)將提供嵌入式性能并在進(jìn)程之間共享,并且更新和查詢響應(yīng)時(shí)間都將大大低于一微秒。

我認(rèn)為沒有理由不應(yīng)該在Java中實(shí)現(xiàn)這些功能。 對(duì)于Java用戶,本機(jī)接口性能最佳,因?yàn)樗恍枰狫NI或?qū)⑹澜绲腃視圖轉(zhuǎn)換為Java視圖。

參考: sun.misc。來自Vanilla Java博客的JCG合作伙伴 Peter Lawrey提供的不安全和堆外內(nèi)存 。

翻譯自: https://www.javacodegeeks.com/2014/01/sun-misc-unsafe-and-off-heap-memory.html

總結(jié)

以上是生活随笔為你收集整理的sun.misc.Unsafe和堆外内存的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。