SharedHashMap是更低延遲無GC暫停的Map實現
SharedHashMap是開源工具OpenHFT一個子專案,SharedHashMap提供ConcurrentHashMap更低延遲無JVM的GC暫停的實現。兩個特點是:
1.所有元素都儲存在Java heap之外,這樣就不受GC影響,沒有GC暫停。
2.所有元素都在一個共享記憶體區域,對所有程式都是可視的。
SharedHashMap採取的是"no-copy"模型,能夠提供off-heap堆記憶體之外記憶體空間,讓應用程式獲得更低延遲更快效能。
它不是普通HashMap,而是一個特殊的,只有在你特殊需要時才使用,如果你想使用JVM堆之外記憶體可以使用它,如果想持久化Map中專案,也可以使用,特別是你想使用一個大的共享Map時。
使用程式碼:
SharedHashMapBuilder builder = new SharedHashMapBuilder(); String shmPath = System.getProperty("java.io.tmpdir") + System.getProperty("file.separator") + "SHMTest1"; //Declare as a ConcurrentMap rather than Map if you want to use putIfAbsent() Map<String, SHMTest1Data> theSharedMap = builder.create(new File(shmPath), String.class, SHMTest1Data.class) <p class="indent"> |
其中SHMTest1Data類是一個簡單的陣列實現。程式碼如下:
public static class SHMTest1Data implements Serializable { private long[] time; public SHMTest1Data(int maxNumberOfProcessesAllowed) { this.time = new long[maxNumberOfProcessesAllowed]; } public int getMaxNumberOfProcessesAllowed() { return this.time.length; } public void setTimeAt(int index, long time) { this.time[index] = time; } public long getTimeAt(int index) { return this.time[index]; } } <p class="indent"> |
使用程式碼如下:
SHMTest1Data data = theSharedMap.get("whatever"); if (data == null) { //From 1.8, we could use putIfAbsent() as that's been added to the Map interface. //Alternatively we can cast to SharedHashMap and use putIfAbsent(). //But for this test just bang it in, doesn't matter if something //else gets in first as you'll see below data = new SHMTest1Data(2); theSharedMap.put("whatever", data); } <p class="indent"> |
在另外一篇java.util.concurrent.ConcurrentHashMap VS openhft.collections.SharedHashMap對比中,SharedHashMap提供了比ConcurrentHashMap出色高效能,
特別是無GC暫停。
[該貼被banq於2014-04-06 10:34修改過]
相關文章
- OpenJDK 17中的Shenandoah可實現亞毫秒級GC暫停JDKNaNGC
- 一次JVM GC長暫停的排查過程JVMGC
- 一次JVM GC長暫停的排查過程!JVMGC
- RabbitMQ實現延遲佇列MQ佇列
- RabbitMQ 實現延遲佇列MQ佇列
- 實現延遲搜尋功能
- Golang 實現 RabbitMQ 的延遲佇列GolangMQ佇列
- 實現簡單延遲佇列和分散式延遲佇列佇列分散式
- 基於rabbitmq延遲外掛實現分散式延遲任務MQ分散式
- javascript實現延遲載入效果JavaScript
- 使用RxJava實現延遲訂閱RxJava
- 延時 (遲) 操作的 PHP 簡單實現PHP
- 延遲訊息的五種實現方案
- JavaScript實現圖片的延遲載入JavaScript
- ManualResetEvent實現執行緒的暫停與恢復執行緒
- php+redis實現延遲佇列PHPRedis佇列
- 如何用RabbitMQ實現延遲佇列MQ佇列
- RabbitMQ、RocketMQ、Kafka延遲佇列實現MQKafka佇列
- 使用RabbitMq原生實現延遲佇列MQ佇列
- win10系統如何如何延遲更新 Win10系統下設定暫停更新的方法Win10
- Go GC:Go 1.5 將會解決延遲問題GoGC
- 微軟稱win10系統更新將允許暫停或停止:最長延遲時間35天微軟Win10
- 使用延遲關聯實現高效分頁
- Netflix使用ZGC實現低延遲GC
- 如何利用PostgreSQL的延遲複製實現災備SQL
- 暫停,掉線,遊戲工作室的現實難題遊戲
- 使用SVG實現的一個Android播放/暫停按鈕SVGAndroid
- vue+樹莓派實現實時視訊播放暫停Vue樹莓派
- 你知道Redis可以實現延遲佇列嗎?Redis佇列
- 高可用延遲佇列設計與實現佇列
- 實驗,暫停oracle後臺程式Oracle
- RabbitMQ延遲訊息的延遲極限是多少?MQ
- jquery淡入淡出無延遲程式碼jQuery
- flutter實現B站播放器暫停時的header效果Flutter播放器Header
- Unity3D中暫停時的動畫及粒子效果實現Unity3D動畫
- 通過video實現視訊暫停時出現圖片IDE
- 如何馴服java GC導致暫停? 使用16GiB以上heapJavaGC
- RabbitMQ實戰《延遲佇列》MQ佇列