2011-09-06 68 views
3

在Java中有什么功能可以告诉运行时关于非托管内存分配,如GC.AddMemoryPressure method in .NETJava内存压力

+2

关于“质量标准”,这是什么东西? –

+0

这是一个通过stackoverflow质量标准检查器的占位符文本。 –

+0

@misha nesterernko占位符文本?如果这不是问题的一部分,那么它不需要在那里。 – berry120

回答

2

我想这在Java中不是必需的。 '如果一个小的托管对象分配了大量的非托管内存'可以简单地不会发生在Java中,如果您通过JNI调用本地(非托管)函数,内存不会分配给JVM的托管内存表。

参考:

+3

严格地说,两个运行时系统对内存管理做出了不同的假设,Java/JRE简单地假设这不是很重要。 –

+2

托管对象可以容纳大量的本机内存和少量的托管内存,因此对于gc它看起来很好,并且它不会收集那些对象。经过一段时间,本机堆已满并抛出OutOfMemoryException。这就像Deflater类的问题。我在http://www.devguli.com/blog/eng/java-deflater-and-outofmemoryerror/发现了这个问题。建议在那里手动调用end()方法。我认为这是一种必须避免使用垃圾回收器的交易(当使用gc时,我们不必担心内存释放问题) –

+0

@Donal Fellows:你可以指向一些读物吗?我不想挑起那个声明,只是有兴趣! – home

2

直接存储器是用Java分开管理的,可以被视为 “非托管”。在Sun/Oracle JVM中,它有自己的内存使用限制,您可以一次达到堆大小和直接内存大小的限制。

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

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

((DirectBuffer) bb).cleaner().clean(); 

你可以这样做一万次,而不会触发GC。

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

+1

这与GC.AddMemoryPressure没有直接关系。这意味着重写应用程序以通过java执行所有本地内存分配。对于许多本地图书馆来说,这是不可接受的。 – yano

+0

@yano希望您可以使用Java(或C#等其他高级语言)编写大​​部分代码,并且只需在本机代码中编写最小代码即可。 –