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
分享到:
相关推荐
- 理解Java内存模型(堆、栈、方法区等)对使用内存分析工具至关重要。 总之,HeapAnalyzer是Java开发者处理内存溢出问题的强大助手。通过熟练掌握其使用,我们可以有效地定位并解决内存问题,提升应用的稳定性和...
IBM Java堆内存分析工具——HeapAnalyzer,是一款专为IBM J9 VM设计的强大内存分析工具,它可以帮助开发者深入理解Java应用程序的内存使用情况,检测并解决内存泄漏问题,从而提升应用性能。本文将详细介绍Heap...
3. **内存泄漏**:程序中存在未被及时回收的不再使用的对象,长期占用内存资源,最终导致可用堆内存耗尽。 #### 解决Java heap space问题的策略 解决Java heap space问题的关键在于合理配置JVM参数,优化内存使用...
然而,在处理大量数据时,Kettle可能会遇到内存管理问题,导致Java堆空间溢出错误。这种错误通常表现为"Java heap space",意味着Java虚拟机(JVM)分配的内存不足以执行任务。 **Java堆空间的原理** Java堆是Java...
在Java编程中,"java heap space"内存溢出是一个常见的问题,它通常发生在应用程序尝试分配超过JVM堆内存限制的对象时。这个问题对于任何Java开发者来说都至关重要,因为如果不妥善处理,可能会导致程序崩溃。以下是...
- **内存泄漏**:程序中存在未释放的对象引用,导致垃圾回收机制无法清理不再使用的对象,从而逐渐耗尽可用内存。 - **大对象频繁创建**:频繁创建和销毁大量对象也会增加 GC(Garbage Collection,垃圾回收)的...
本文将详细介绍如何使用JMAP工具来定位Java代码中的内存泄漏问题。 首先,理解内存泄漏的概念:内存泄漏是指程序在申请内存后,无法释放已申请的内存空间,一次小的内存泄漏可能并不明显,但随着时间的推移,这些未...
HeapAnalyzer456.jar 是一个专门用于分析Java内存溢出的专业工具,它可以帮助开发者深入理解内存的分配、使用和泄漏状况。本篇文章将详细介绍如何使用HeapAnalyzer456.jar来分析Java内存溢出问题。 首先,我们需要...
1. 使用 `-Xmx` 参数增加堆的最大使用内存:可以在启动 JVM 时添加 `-Xmx` 参数,例如 `-Xmx512m`,以设置堆的最大使用内存。 2. 使用 `-Xms` 参数设置堆的初始大小:可以在启动 JVM 时添加 `-Xms` 参数,例如 `-Xms...
在Java中,内存泄露通常发生在对象不再被程序使用但仍然保持在内存中,导致可用内存逐渐减少。长期的内存泄露会导致Java虚拟机(JVM)的堆内存耗尽,引发OutOfMemoryError。 检查Java内存泄露的方法主要包括以下几...
其中,“java.lang.OutOfMemoryError: Java heap space”是一种常见的异常情况,它表明Java虚拟机(JVM)的堆内存空间已耗尽。 #### 标题和描述中的知识点详解 **标题:“java错误处理:java.lang.OutOfMemoryError:...
IBM HeapAnalyzer 最新版本 java内存分析工具,性能调优,内存泄露排除比不可少的工具
JavaCore和HeapDump是两种重要的Java应用程序诊断工具,它们用于理解和优化Java应用程序的性能和内存使用情况。在Java运行环境中,遇到性能问题或者内存泄漏时,开发者通常会借助这类工具来定位问题。 JavaCore,也...
Java的内存管理主要集中在堆(Heap)区域,其中对象的创建通常是通过`new`关键字或反射方式完成,而对象的释放则由Java虚拟机(JVM)通过垃圾回收(GC)机制自动处理。对象回收的基本原则是:当一个对象不再被任何活动路径...
IBM HeapAnalyzer是一款强大的Java内存分析工具,主要用于诊断和解决Java应用程序中的内存泄漏问题。这款工具通过对Java堆内存的深入分析,帮助开发者定位那些占用过多内存的对象,从而优化应用性能。在Java开发过程...
### Java VM Heap 堆分析知识点详解 #### JVM内的内存管理 Java虚拟机(JVM)在执行Java程序的过程中,会负责内存的分配与回收。内存管理主要包括对象的创建、存储以及垃圾回收等过程。 - **Root Set 和对象的...
4. **使用内存分析工具**: - 可以借助如VisualVM、Eclipse Memory Analyzer (MAT)等工具来监控和分析程序的内存使用情况。 - 通过这些工具可以帮助开发者更准确地定位到内存泄漏的位置,并给出优化建议。 5. **...
内存泄露是Java应用程序中常见的问题,它会导致程序性能下降,甚至最终引发`java/lang/OutOfMemoryError`。IBM HeapAnalyzer和Pattern Modeling and Analysis (PMA)是两种强大的工具,专门用于诊断和解决这类问题。 ...
程序运行时所使用的内存主要分为两类:堆内存(Heap Memory)和栈内存(Stack Memory)。理解这两种内存类型的工作原理及其区别对于优化程序性能、避免内存泄漏等问题至关重要。本文将深入探讨Java中堆内存与栈内存...