java内存压力

java内存压力,java,memory,garbage-collection,unmanaged-memory,Java,Memory,Garbage Collection,Unmanaged Memory,Java中是否有告诉运行时有关非托管内存分配的功能,如?我想这在Java中不是必需的如果一个小的托管对象分配了大量的非托管内存,那么在Java中根本不可能发生这种情况,如果您通过JNI调用本机(非托管)函数,那么内存不会分配给JVM的托管内存表 供参考: 直接内存在Java中单独管理,可以认为是“非托管的”。在Sun/Oracle JVM中,它有自己的内存使用限制,您可以同时达到堆大小和直接内存大小的限制 在Sun/Oracle JVM中,可以使用内部API显式释放直接内存块。你甚至很少需要

Java中是否有告诉运行时有关非托管内存分配的功能,如?

我想这在Java中不是必需的如果一个小的托管对象分配了大量的非托管内存,那么在Java中根本不可能发生这种情况,如果您通过JNI调用本机(非托管)函数,那么内存不会分配给JVM的托管内存表

供参考:


直接内存在Java中单独管理,可以认为是“非托管的”。在Sun/Oracle JVM中,它有自己的内存使用限制,您可以同时达到堆大小和直接内存大小的限制

在Sun/Oracle JVM中,可以使用内部API显式释放直接内存块。你甚至很少需要这样做,但这里是如何做到的

ByteBuffer bb = ByteBuffer.allocateDirect(1024*1024);

((DirectBuffer) bb).cleaner().clean();
您可以在不触发GC的情况下执行一万次


顺便说一句:内存映射文件使用少量堆,不计入直接内存限制。您可以映射的数量实际上是无限的。(虽然在一个MappedByteBuffer中限制为2GB)

关于“质量标准”的内容是什么?这是通过stackoverflow质量标准检查器的占位符文本。@misha nesterernko占位符文本?如果这不是问题的一部分,那么它就没有必要存在。严格来说,这两个运行时系统对内存管理做出了不同的假设,Java/JRE只是假设这不是很重要。托管对象可以容纳大量的本机内存,而托管内存却非常少,所以对于gc来说,它看起来是正常的,并且它不收集这些对象。一段时间后,本机堆已满,并引发OutOfMemoryException。这就像是平减器类的问题。我已在以下位置找到此问题:。建议手动调用end()方法。我认为这是一种必须避免使用垃圾收集器的交易(当使用gc时,我们不必担心内存释放)@Donal Fellows:你能指出一些读数吗?我不想质疑那句话,只是感兴趣而已!这与GC.AddMemoryPressure没有直接关系。这意味着重新编写应用程序,通过java执行所有本机内存分配。对于许多本机库来说,这是不可接受的。@yano希望您用Java(或另一种高级语言,如C#)编写大部分代码,如果可能的话,只编写最少的本机代码。