Java中是否有类似于.NET中GC.AddMemoryPressure方法的功能,可以告诉运行时关于非托管内存分配的情况?
Java中是否有类似于.NET中GC.AddMemoryPressure方法的功能,可以告诉运行时关于非托管内存分配的情况?
直接内存在Java中是单独管理的,可以被视为“非托管”内存。在Sun/Oracle JVM中,它有自己的内存使用限制,您可以同时达到堆大小和直接内存大小的限制。
在Sun/Oracle JVM中,您可以使用内部API显式释放直接内存块。但这是很少需要做的,以下是如何操作:
ByteBuffer bb = ByteBuffer.allocateDirect(1024*1024);
((DirectBuffer) bb).cleaner().clean();
你可以重复执行这个操作一万次而不触发垃圾回收。
顺便说一下:内存映射文件只使用少量堆内存,不计入直接内存限制。你可以映射的数量实际上是无限的。(但在一个MappedByteBuffer中限制为2GB)