2013-04-30 73 views
4

巨大的頁面和DirectByteBuffer在Java熱點JVM我想怎麼辦在Linux上使用

我需要使用直接存儲器來避免GC走動的事情。我想爲這些頁面啓用大頁面。

到目前爲止

標誌-XX:+ UseLargePages使用堆緩衝區(非直接的ByteBuffers)時工作正常,但使用DirectByteBuffers時不工作了。 我也嘗試過使用MappedByteBuffers和一個hugetlbfs文件系統。這工作但提出了一些問題,所以我正在尋找一個不同的解決方案。

配置 CentOS版本6.3,熱點,jdk1.7

[編輯]

看熱點的源代碼,他們使用的是一個malloc與不安全,分別的shmat分配內存/ shmget或mmap將需要使用巨大的頁面。

[編輯]爲什麼非堆內存

我們正處在一個NUMA背景下,對於內存數據庫,有很多長壽的對象。當UseNUMA標誌打開時,JVM不會對舊的分區進行分區。使用直接內存可以讓我們將內存保持在需要它的線程附近。

基準測試在決定使用DirectByteBuffers方面顯然扮演着重要角色。我是而不是問我是否應該使用DirectByteBuffer,我寧願尋找我的問題的答案。

回答

1

對於那些有興趣,鏈接到oracle bug report

鏈接到相應的openJDK ticket。關閉,因爲目前尚無法修復。 在Linux上,THP功能可能會有所幫助,儘管它帶有一系列問題。

0

您是否有一個基準確定地表明GC重新定位是您應用程序的瓶頸?

如果不是,請不要這樣做。

如果是這樣,請添加一個鏈接,以便它可以進行同行評審。

這些類型的低級別的影響是衆所周知的難以分離作爲性能問題的原因,這是非常可能浪費大量的時間追幻象效果&產生它試圖繞過JVM &唯一結果的溶液如果你堅持走得很好的道路,那麼性能將遠遠低於你所獲得的性能。

0

解決方法是使用JNI在C中使用任何方法分配內存並返回一個ByteBuffer。請參閱NewDirectByteBuffer。這種方法還有額外的好處,即你可以確定性地釋放內存。