`
badqiu
  • 浏览: 674446 次
  • 性别: 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
分享到:
评论

相关推荐

    java 内存溢出分析工具 HeapAnalyzer

    - 理解Java内存模型(堆、栈、方法区等)对使用内存分析工具至关重要。 总之,HeapAnalyzer是Java开发者处理内存溢出问题的强大助手。通过熟练掌握其使用,我们可以有效地定位并解决内存问题,提升应用的稳定性和...

    ibm-java-堆内存分析工具-heapanalyzer

    IBM Java堆内存分析工具——HeapAnalyzer,是一款专为IBM J9 VM设计的强大内存分析工具,它可以帮助开发者深入理解Java应用程序的内存使用情况,检测并解决内存泄漏问题,从而提升应用性能。本文将详细介绍Heap...

    解决Java_heap_space问题

    3. **内存泄漏**:程序中存在未被及时回收的不再使用的对象,长期占用内存资源,最终导致可用堆内存耗尽。 #### 解决Java heap space问题的策略 解决Java heap space问题的关键在于合理配置JVM参数,优化内存使用...

    kettle内存溢出(Java heap space)以及解决方法.docx

    然而,在处理大量数据时,Kettle可能会遇到内存管理问题,导致Java堆空间溢出错误。这种错误通常表现为"Java heap space",意味着Java虚拟机(JVM)分配的内存不足以执行任务。 **Java堆空间的原理** Java堆是Java...

    关于(java heap space)内存溢出的解决办法

    在Java编程中,"java heap space"内存溢出是一个常见的问题,它通常发生在应用程序尝试分配超过JVM堆内存限制的对象时。这个问题对于任何Java开发者来说都至关重要,因为如果不妥善处理,可能会导致程序崩溃。以下是...

    java抛java heap space

    - **内存泄漏**:程序中存在未释放的对象引用,导致垃圾回收机制无法清理不再使用的对象,从而逐渐耗尽可用内存。 - **大对象频繁创建**:频繁创建和销毁大量对象也会增加 GC(Garbage Collection,垃圾回收)的...

    java使用JMAP定位代码内存泄漏在哪

    本文将详细介绍如何使用JMAP工具来定位Java代码中的内存泄漏问题。 首先,理解内存泄漏的概念:内存泄漏是指程序在申请内存后,无法释放已申请的内存空间,一次小的内存泄漏可能并不明显,但随着时间的推移,这些未...

    基于HeapAnalyzer456.jar 分析java内存溢出

    HeapAnalyzer456.jar 是一个专门用于分析Java内存溢出的专业工具,它可以帮助开发者深入理解内存的分配、使用和泄漏状况。本篇文章将详细介绍如何使用HeapAnalyzer456.jar来分析Java内存溢出问题。 首先,我们需要...

    java.lang.OutOfMemoryError: Java heap space 解决方法

    1. 使用 `-Xmx` 参数增加堆的最大使用内存:可以在启动 JVM 时添加 `-Xmx` 参数,例如 `-Xmx512m`,以设置堆的最大使用内存。 2. 使用 `-Xms` 参数设置堆的初始大小:可以在启动 JVM 时添加 `-Xms` 参数,例如 `-Xms...

    java内存泄露、溢出检查方法和工具

    在Java中,内存泄露通常发生在对象不再被程序使用但仍然保持在内存中,导致可用内存逐渐减少。长期的内存泄露会导致Java虚拟机(JVM)的堆内存耗尽,引发OutOfMemoryError。 检查Java内存泄露的方法主要包括以下几...

    java错误处理:java.lang.OutOfMemoryError: Java heap space

    其中,“java.lang.OutOfMemoryError: Java heap space”是一种常见的异常情况,它表明Java虚拟机(JVM)的堆内存空间已耗尽。 #### 标题和描述中的知识点详解 **标题:“java错误处理:java.lang.OutOfMemoryError:...

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

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

    JavaCore和HeapDump分析工具

    JavaCore和HeapDump是两种重要的Java应用程序诊断工具,它们用于理解和优化Java应用程序的性能和内存使用情况。在Java运行环境中,遇到性能问题或者内存泄漏时,开发者通常会借助这类工具来定位问题。 JavaCore,也...

    如何解决Java内存泄漏

    Java的内存管理主要集中在堆(Heap)区域,其中对象的创建通常是通过`new`关键字或反射方式完成,而对象的释放则由Java虚拟机(JVM)通过垃圾回收(GC)机制自动处理。对象回收的基本原则是:当一个对象不再被任何活动路径...

    ibm HeapAnalyzer java内存分析工具 ha457.jar

    IBM HeapAnalyzer是一款强大的Java内存分析工具,主要用于诊断和解决Java应用程序中的内存泄漏问题。这款工具通过对Java堆内存的深入分析,帮助开发者定位那些占用过多内存的对象,从而优化应用性能。在Java开发过程...

    Java VM Heap 堆分析(节选)

    ### Java VM Heap 堆分析知识点详解 #### JVM内的内存管理 Java虚拟机(JVM)在执行Java程序的过程中,会负责内存的分配与回收。内存管理主要包括对象的创建、存储以及垃圾回收等过程。 - **Root Set 和对象的...

    Myeclipse下java.lang.OutOfMemoryError Java heap space的解决

    4. **使用内存分析工具**: - 可以借助如VisualVM、Eclipse Memory Analyzer (MAT)等工具来监控和分析程序的内存使用情况。 - 通过这些工具可以帮助开发者更准确地定位到内存泄漏的位置,并给出优化建议。 5. **...

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

    内存泄露是Java应用程序中常见的问题,它会导致程序性能下降,甚至最终引发`java/lang/OutOfMemoryError`。IBM HeapAnalyzer和Pattern Modeling and Analysis (PMA)是两种强大的工具,专门用于诊断和解决这类问题。 ...

    Java中堆内存与栈内存分配浅析

    程序运行时所使用的内存主要分为两类:堆内存(Heap Memory)和栈内存(Stack Memory)。理解这两种内存类型的工作原理及其区别对于优化程序性能、避免内存泄漏等问题至关重要。本文将深入探讨Java中堆内存与栈内存...

Global site tag (gtag.js) - Google Analytics