Java内存泄漏是否可能使用比堆+永久代更多的内存?

3

在任何情况下,对于Java应用程序(例如Tomcat servlet应用程序)中的泄漏,是否可能超出分配的内存并使用其他系统内存,或者JVM的分配堆是否真正被防火墙隔离(以此类推)与(其余的)OS / Kernel内存?我正在使用2.6内核Linux和Java 6和7进行工作,但这更是一个一般性问题。


是的。JVM除了通过Java堆之外,还有许多其他方式可以消耗内存。例如,默认情况下,每个线程都需要2Mb的堆栈空间。如果您描述您遇到的问题,也许有人会帮助您解决它们。 - kdgregory
这其实更像是一个普遍性的问题。我和一些Java开发人员在电话会议上交流时,我提出了内存泄漏可能会吃掉堆以外的系统内存,但项目中的高级开发人员告诉我这是不可能的。我不同意这是不可能的,但我不知道具体情况,我相信我在过去曾经见过这种情况发生。 - GL2014
2个回答

3

是的 - 这是可能的。Java内存区域被划分为几个区域 - 堆和永久代不是全部。还有代码缓存区和本机内存区域,这对于所有堆外结构来说非常流行。请查看此演示文稿的第7页。


那个演示看起来很有趣。喜欢这些图片。 - GL2014

2
当然可以。简单的例子是ByteBuffer.allocateDirect()FileChannel.map()。这些缓冲区的内容不在Java Heap中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接