我寫了一個股票市場模擬器,它使用一個ConcurrentHashMap
作爲緩存。寫一個高性能的緩存
緩存容納大約75個元素,但它們更新和檢索得非常快(每秒約500次)。
這裏是我做過什麼:
主題1:
連接到爲我提供串流報價爲給定的股票代碼的外部系統。
線程2(回調線):
等到數據被外部系統交付給它。一旦獲取數據,它就會解析數據,創建一個不可變的DataEntry對象,將其緩存起來並向thread3發送一個信號。
線程3(消費者線程): 收到信號後,從緩存中檢索DataEntry並使用它。 (這是任務中不讓thread2直接將數據推送到thread3的任務的一部分)。
public final class DataEntry{
private final String field1;
private final String field2;
//...
private final String field25;
// Corresponding setters and getters
}
public final class Cache{
private final Map<String, DataEntry> cache;
public Cache(){
this.cache = new ConcurrentHashMap<String, DataEntry> (65, 0.75, 32);
}
// Methods to update and retrieve DataEntry from the cache.
}
通過分析器運行它之後,我發現我創建一個很多DataEntry
對象。因此伊甸園很快就要填滿了。
所以,我想通過調整設計了一下:
一)使得DataEntry
級可變。
b)用空的DataEntry
對象預填充緩存。
c)當更新到達時,從地圖檢索DataEntry
對象並填充字段。
這樣,DataEntry
對象的數量將不變並等於元素的數量。
我的問題是:
一)這是否設計有一個我可以通過使DataEntry
可變紛紛推出任何併發問題。
b)我還有什麼可以優化緩存嗎?
謝謝。
您可以每秒訪問超過一百萬次的ConcurrentHasMap,如果您只訪問它,它不會有太大影響500次/秒。 – 2011-12-22 15:27:14
如果您希望一次接近16個或更多內核,則只會增加分區大小。如果您使用的核心數量少於說4個內核同時訪問地圖(而沒有做其他任何事情),那麼它不太可能會產生很大的差異。 – 2011-12-22 15:30:24
爲什麼Eden很快就會填滿問題?您是否因Eden GC而遇到問題? – kdgregory 2011-12-22 21:42:05