您的位置:首页 > 编程语言 > Java开发

where memory is allocate outside of Java heap. gc

2012-06-08 13:27 295 查看
7

down vote
favorite
2
share [g+]

share [fb]
share [tw]
JDK provides abillity to allocate so-called direct ByteBuffers, where memory is allocate outside of Java heap. This can be beneficial since this memory is not touched by garbage collector, and as such does not contribute to GC overhead: this is a very useful
for property for long-living things like caches.

However, there is one critical problem with existing implementation: underlying memory is only allocated asynchronously when the owning ByteBuffer is garbage-collected; there is no way to force early deallocation. This can be problematic since GC cycle itself
is not influenced by handling of ByteBuffers, and given that ByteBuffers are likely to reside in Old Generation memory area, it is possible that GC is called hours after ByteBuffer is no longer in use.

But in theory it should be possible to use
sun.misc.Unsafe
methods (freeMemory, allocateMemory) directly: this is what JDK itself uses for allocating/deallocating native memory.
Looking at code, one potential concern I see is possibility of double-freeing of memory -- so I would want to make sure that state would be properly cleaned.

Can anyone point me to code that does this? Ideally would want to use this instead of JNA.

NOTE: I saw
this question which is sort of related.

Looks like the answers pointed out are good way to go:
here is code example from Elastic Search that uses the idea. Thanks everyon!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐