java使用java heap外(堆外)内存导致的内存泄露
java可以通过?java.nio.ByteBuffer.allocateDirect(capacity) 直接使用non java heap(java堆外)的内存 。
?
一.使用目的:1。开辟数据缓冲区
2。可以突破jvm内存限制,操作更多的物理内存(不同的jvm实现不一样,sun jvm会被限制,但能增加jvm能够操纵的一倍内存,而jrockit基本上可以将物理内存全部耗光)
?
二.使用问题:通过ByteBuffer.allocateDirect()使用的内存不能够通过jvm相关内存工具:VisualVM等查看heap的内存占用,所以内存泄露也较难查找。
?
三. 测试如下:?
?
?
打印结果:
?
?
Heap内存分配
?
?
实际java进程内存占用:
?
?
通过VisualVM可以发现,java heap根本没有使用,但java进程的物理内存已经使用400MB+
?
四.测试结论:?
1. 使用ByteBuffer.allocateDirect()分配出去的内存无法通过Heap查看
2.?ByteBuffer.allocateDirect()分配的内容可以被GC回收,但泄露的话较难查找
?
?
?