3

Java 中是否有功能可以告诉运行时有关非托管内存分配的信息,例如.NET 中的 GC.AddMemoryPressure 方法

4

2 回答 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 回答