`
badqiu
  • 浏览: 670104 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

java使用java heap外(堆外)内存导致的内存泄露

    博客分类:
  • Java
 
阅读更多

java可以通过 java.nio.ByteBuffer.allocateDirect(capacity) 直接使用non java heap(java堆外)的内存 。

 

一.使用目的:

1。开辟数据缓冲区

2。可以突破jvm内存限制,操作更多的物理内存(不同的jvm实现不一样,sun jvm会被限制,但能增加jvm能够操纵的一倍内存,而jrockit基本上可以将物理内存全部耗光)

 

二.使用问题:

通过ByteBuffer.allocateDirect()使用的内存不能够通过jvm相关内存工具:VisualVM等查看heap的内存占用,所以内存泄露也较难查找。

 

三. 测试如下:

 

 

public class ByteBufferTest {
	
	public static void main(String[] args) throws InterruptedException {
		System.out.println(SystemRuntimeInfo.getMemoryInfo());
		List list = new ArrayList();
		for(int i = 0; i < 100; i++) {
			list.add(ByteBuffer.allocateDirect(Integer.MAX_VALUE / 100));
			System.out.println(i + " " + SystemRuntimeInfo.getMemoryInfo()); // 自己写的内存占用工具类
		}
		System.out.println("start sleep,list.size():"+list.size());
		Thread.sleep(100000);
		System.out.println(list.size());
		
		// java.nio.ByteBuffer.allocate(capacity) 使用 java heap(java堆)分配内存: 可以直接通过工具查看出内存占用
		// java.nio.ByteBuffer.allocateDirect(capacity) 使用non java heap(非java堆)通过操作系统直接分配内存: 会导致查看不出java heap的内存占用,导致泄露看不出来
		
	}
	
}

 

打印结果:

 

 

----------------------
  totalHeapMemory:15MB  freeHeapMemory:14MB  maxHeapMemory:247MB totalPhysicalMemorySize:2047MB freePhysicalMemorySize:1285MB usedPhysicalMemory:762MB 
0 totalHeapMemory:15MB  freeHeapMemory:14MB  maxHeapMemory:247MB totalPhysicalMemorySize:2047MB freePhysicalMemorySize:1264MB usedPhysicalMemory:783MB 
1 totalHeapMemory:15MB  freeHeapMemory:14MB  maxHeapMemory:247MB totalPhysicalMemorySize:2047MB freePhysicalMemorySize:1244MB usedPhysicalMemory:803MB 
2 totalHeapMemory:15MB  freeHeapMemory:14MB  maxHeapMemory:247MB totalPhysicalMemorySize:2047MB freePhysicalMemorySize:1223MB usedPhysicalMemory:824MB 
3 totalHeapMemory:15MB  freeHeapMemory:14MB  maxHeapMemory:247MB totalPhysicalMemorySize:2047MB freePhysicalMemorySize:1203MB usedPhysicalMemory:844MB 
4 totalHeapMemory:15MB  freeHeapMemory:14MB  maxHeapMemory:247MB totalPhysicalMemorySize:2047MB freePhysicalMemorySize:1182MB usedPhysicalMemory:865MB 
5 totalHeapMemory:15MB  freeHeapMemory:14MB  maxHeapMemory:247MB totalPhysicalMemorySize:2047MB freePhysicalMemorySize:1162MB usedPhysicalMemory:885MB 
6 totalHeapMemory:15MB  freeHeapMemory:14MB  maxHeapMemory:247MB totalPhysicalMemorySize:2047MB freePhysicalMemorySize:1141MB usedPhysicalMemory:906MB 
7 totalHeapMemory:15MB  freeHeapMemory:14MB  maxHeapMemory:247MB totalPhysicalMemorySize:2047MB freePhysicalMemorySize:1121MB usedPhysicalMemory:926MB 
8 totalHeapMemory:15MB  freeHeapMemory:14MB  maxHeapMemory:247MB totalPhysicalMemorySize:2047MB freePhysicalMemorySize:1100MB usedPhysicalMemory:947MB 
9 totalHeapMemory:15MB  freeHeapMemory:14MB  maxHeapMemory:247MB totalPhysicalMemorySize:2047MB freePhysicalMemorySize:1079MB usedPhysicalMemory:968MB 
 

 

VisualVM内存查看:

Heap内存分配

 

 

实际java进程内存占用:

 

 

通过VisualVM可以发现,java heap根本没有使用,但java进程的物理内存已经使用400MB+

 

四.测试结论:

 

1. 使用ByteBuffer.allocateDirect()分配出去的内存无法通过Heap查看

2. ByteBuffer.allocateDirect()分配的内容可以被GC回收,但泄露的话较难查找

 

 

 

  • 大小: 21 KB
  • 大小: 40.2 KB
  • 大小: 10.2 KB
1
1
分享到:
评论

相关推荐

    IBM HeapAnalyzer 最新版本 java内存分析工具

    IBM HeapAnalyzer 最新版本 java内存分析工具,性能调优,内存泄露排除比不可少的工具

    Java内存分析工具(IBM heapAnalyzer ha457)

    IBM开发的强大的内存dump分析工具,IBM heapAnalyzer是通过分析OOM后的Java heap dump文件的,通过对dump文件的分析找到可能泄露的点,这是IBM官方的工具,它对堆栈调用做了可视化的转换,可以更直观地看到调用关系...

    javacore和dump分析工具

    这个文件最重要的作用就是分析 Java 堆内存泄露问题,heap analyzer,MAT 等工具都可以分析这种文件。 Java core 文件保存的是 java 应用程序在崩溃时或任一时刻关于 Java 运行环境的各种信息。包括 Java 虚拟机的...

    IBMHeapAnalyzer JAVA内存分析工具

    IBMHeapAnalyzer是一个非常重要的JAVA程序bug分析工具。它可以帮助我们分析哪些原因可能导致了程序的内存溢出...IBM heapAnalyzer是通过分析OOM后的Java heap dump文件的,通过对dump文件的分析找到内存可能泄露的点。

    Java 内存分析工具

    Java内存分析工具,解决内存泄漏问题

    IBM Heap analyzer

    IBM开发的强大的内存dump分析工具,,IBM heapAnalyzer是通过分析OOM后的Java heap dump文件的,通过对dump文件的分析找到内存可能泄露的点

    Tomcat内存泄露问题排查

    MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰富的Java heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗。使用内存分析工具从众多的对象中进行分析,快速的计算出在内存...

    IBM heapdump analyzer

    在我们的应用程序发生内存泄露的时候,会生成heapdump文件 2,IBM的Thread and Monitor Dump Analyzer for Java工具 在一些平台上,在有些情况下,javacore也被称为javadump,它包含jvm和应用程序相关的在特定时刻的...

    Mac OS java内存分析工具MAT

    Mac OS java内存分析工具,Eclipse MAT(Memory analyse tool)

    Heap Snapshot工具

    Heap Snapshot工具 获取Java堆内存详细信息,可以分析出内存泄漏的问题

    Java Heap Cleaner:简单的函数清理,在运行时,Java堆内存,从而防止java OutOfMemory错误-matlab开发

    Java Heap Cleaner 是 Java 类的 MATLAB 包装器,可清除 Java 堆内存泄漏,防止臭名昭著的 Java OutOfMemory 异常。 Java 代码重新初始化一些负责内存泄漏的 JVM 类,然后强制进行垃圾回收。 重新初始化的 Java 类...

    java 内存dump分析和thread dump(java core)分析

    包括 堆内存dump分析工具和thread dump(java core)的分析工具 还包括两篇关于dump分析的文档,分析java系统内存泄露死循环等非常需要啊有木有

    内存泄露分析工具(IBM HeapAnalyzer 和 Pattern Modeling and Analysis )

    javacore文件分析器和heapdump文件分析器

    如何识别Java中的内存泄漏

    然而可能有人不知道的是,即使使用了垃圾回收机制,Java中仍然可能存在内存泄漏风险。如果你碰到下面的错误代码:  java.lang.OutOfMemoryError: Java heap space  如果你确认是内存分配不足,那么可以通过以下...

    java核心面试技术点

    java 内存模型 ( java memory model ):根据Java Language Specification中的说明, jvm系统中存在一个主内存(Main Memory或Java Heap Memory),Java中所有对象成员变量都储存在主存中,对于所有线程都是共享的。...

    IBM HeapAnalyzer

    Java dump文件查看工具 IBM heapAnalyzer, IBM HeapAnalyzer是一款免费的JVM内存堆的图形分析工具,它可以有效的列举堆的内存使用状况,帮助分析Java内存泄漏的原因。

    java核心面试

    java 内存模型 ( java memory model ):根据Java Language Specification中的说明, jvm系统中存在一个主内存(Main Memory或Java Heap Memory),Java中所有对象成员变量都储存在主存中,对于所有线程都是共享的。...

    Android 内存泄漏调试经验分享

    二、Android(Java)中常见的容易引起内存泄漏的不良代码 1 (一) 查询数据库没有关闭游标 2 (二) 构造Adapter时,没有使用缓存的 convertView 3 (三) Bitmap对象不在使用时调用recycle()释放内存 4 (四) 释放对象的...

    java内存分析工具介绍

    java内存分析工具介绍,分析内存泄漏及监控之。

Global site tag (gtag.js) - Google Analytics