Java 中是否有功能可以告诉运行时有关非托管内存分配的信息,例如.NET 中的 GC.AddMemoryPressure 方法?
问问题
1825 次
2 回答
2
我想这在 Java 中不是必需的。“如果一个小的托管对象分配了大量的非托管内存”在 Java 中根本不会发生,如果您通过 JNI 调用本机(非托管)函数,则内存不会分配给 JVM 的托管内存表。
以供参考:
于 2011-09-06T12:46:28.663 回答
2
直接内存在 Java 中是单独管理的,可以认为是“非托管的”。在 Sun/Oracle JVM 中,它有自己的内存使用限制,您可以同时达到堆大小和直接内存大小的限制。
在 Sun/Oracle JVM 中,您可以使用内部 API 显式释放直接内存块。您甚至需要这样做是很少见的,但这里是如何
ByteBuffer bb = ByteBuffer.allocateDirect(1024*1024);
((DirectBuffer) bb).cleaner().clean();
你可以这样做一万次而不触发 GC。
顺便说一句:内存映射文件使用少量堆,不计入直接内存限制。您可以映射的数量实际上是无限的。(虽然在一个 MappedByteBuffer 中限制为 2GB)
于 2011-09-06T13:41:05.317 回答