Java GC can only run in JVM heap which is called on-heap memory. However, to control the rubbish collection size of Java GC to realse some pressure of it . we can also open some memory space outside JVM heap in the Operating system level. This part of memory is called off-heap memory.
How do we manipulate off-heap memory ?
Normally there exits 3 opensource library for us to use , Chronicle Queue、Chronicle Map and Thread Affinity . These 3 can help us manipulate off-heap memory flexibly.When do we use off-heap memory ?
- When Some Java NIO related APIs are called, we may use off-heap memory indirectly. Operating system's kernel(eg: linux kernel) will directly write data into the off-heap memory rather than do like normal API caching one copy of data in the linux kernel then copying another one into the application when the application want to read.
- When Java JVM management can't fullfil the project's requirement, we need to use the off-heap memory and manage it flexbily ourselves.
For example :
One incoming connection is to ask for 2M to create 2000 small Objects in Java and to release this 2M memory immediatly when connection is finished/broken. For Java GC, this is a extra burden to manage those extra 2000 objects and GC doesn't know those 2000 Objects' memory can be released immediatly after being used (Connection is finsihed). But we , programmers, know this logic and we know better what will happen in the system memory and JVM, so in that case , we can write code ourselves to manage the memory in the most efficient way.
How do we create a off-heap memory space?
One of those methods is to use DirectBuffer :ByteBuffer.allocateDirect(size)
Another way is to use JNI to write a C/C++ extension in JAVA, in the extension, we don't create memory space in JVM.
But normally, I don't think people may need write in this very backend way.
If you are focus on normal business logic , I think chronicleMap will fullfil your requirement.
If you are writing some frameworks in Java related to NIO, the first method may apply(eg: Netty , ActiveMQ).
But if you don't limit your language in Java, write a C extension to control the whole system. This is the best solution, isn't it.
No comments:
Post a Comment