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

观察NIO的direct memory使用量?

    博客分类:
  • Java
阅读更多
前几天有同事问起,我本来印象中是有啥别的办法的,但想不起来了。
再看了看NIO相关部分的源码觉得貌似就这个办法靠谱(在Oracle/Sun的JDK上):
StackOverflow: Looking up how much direct buffer memory is available to Java?
通过反射获取java.nio.Bits类里的maxMemory与reservedMemory字段来达到观察的目的。

用Groovy演示一下:
D:\sdk\groovy-1.7.6\bin>groovysh
Groovy Shell (1.7.6, JVM: 1.6.0_26)
Type 'help' or '\h' for help.
-------------------------------------------------------------------------------
groovy:000> import java.nio.*
===> [import java.nio.*]
groovy:000> Bits.reservedMemory
===> 0
groovy:000> Bits.maxMemory
===> 67108864
groovy:000> buf = ByteBuffer.allocateDirect(4096)
===> java.nio.DirectByteBuffer[pos=0 lim=4096 cap=4096]
groovy:000> Bits.reservedMemory
===> 4096
groovy:000> Bits.maxMemory
===> 129761280
groovy:000> buf.direct
===> true
groovy:000> buf.hasArray()
===> false
groovy:000> buf.cleaner().clean()
===> null
groovy:000> Bits.reservedMemory
===> 0
groovy:000> Bits.maxMemory
===> 129761280
groovy:000> quit


虽说HotSpot VM有个VM参数叫做MaxDirectMemorySize,但实际上HotSpot VM并没使用这个参数,而是直接把它交给Java层,由NIO的Java部分来使用它。NIO的direct memory的分配和释放过程也没啥JMX之类的监控,完全是裸的,除了反射去暴力获取数据我还真不知道有啥办法了。

但这种暴力做法未必能持续靠谱。
例如说这里就有个patch稍微改变过Bits类的字段:http://cr.openjdk.java.net/~alanb/4837564/jdk/jdk.patch
反正是private的,改了也不需要通知普通的Java用户。

这么重要的数据居然没有合适的API去监控,真不爽…
分享到:
评论

相关推荐

    NIO与零拷贝_javanio_nio和零拷贝_

    在Java NIO中,零拷贝主要体现在通过DMA(Direct Memory Access,直接内存访问)和操作系统内核层面的优化来实现。 1. **NIO基础** - **通道(Channels)**:通道类似于流,但它是双向的,可以读也可以写。常见的...

    Java-NIO-Programming-Cookbook(含源码)

    Java NIO(非阻塞I/O)编程是Java平台中的一种高效I/O处理方式,相比传统的BIO(阻塞I/O),NIO提供了更灵活、性能更高的数据传输机制。本书《Java NIO Programming Cookbook》旨在深入浅出地介绍如何利用Java NIO...

    使用nio导出千万大数据

    4. **内存映射文件(Memory-Mapped File)**:NIO支持将文件直接映射到内存,通过直接缓冲区(Direct Buffer)进行访问,减少了磁盘I/O操作,加快了大数据的读写速度。 在导出千万级别的大数据时,我们可能需要考虑...

    缓冲池 java

    Java提供了一些系统属性来调整缓冲池的大小,例如`-Djava.nio.channels.FileChannel.mapMode=normal`可以设置文件映射模式,`-Djava.nio.directMemory.page.size=16k`可以设置直接内存页大小。合理配置这些参数可以...

    堆外内存部分代码

    1. **直接内存(Direct Memory)**:Java的NIO(New Input/Output)库支持直接内存分配,数据可以直接在物理内存中读写,减少了Java对象之间的内存拷贝,提升了性能。使用`java.nio.DirectByteBuffer`类可以创建直接...

    Java堆外内存的使用Java开发Java经验技巧共5页

    堆外内存,也被称为直接内存(Direct Memory),是指不在JVM的堆内存中分配的内存,而是直接在操作系统的本地内存中进行分配。这样可以避免Java对象创建时的额外开销,例如垃圾收集的检查和内存分配的慢速。 1. **...

    11_直接内存.pptx

    直接内存(Direct Memory)在Java虚拟机(JVM)中是一个重要的优化手段,它与Java堆内存和栈内存不同,不直接由Java对象引用。直接内存的使用主要涉及到Java的NIO(New Input/Output)库,特别是ByteBuffer类。这个...

    Java开发者必须了解的堆外内存技术.docx

    堆外内存,也称为直接内存(DirectMemory),是指在JVM堆内存之外分配的内存区域。它并非JVM规范定义的标准内存区域,但因其在IO操作中的性能优势而被广泛应用于高效的NIO框架中,如Netty和RPC。 直接内存的优势...

    Java IO合集

    6. 零拷贝技术:如直接缓冲区(Direct Buffers)和内存映射文件(Memory-Mapped Files),如何减少数据传输中的CPU和内存开销。 7. Socket通信:NIO中的SocketChannel和ServerSocketChannel,以及它们如何改进网络I/...

    Java内存溢出解决办法

    3. **优化代码**:减少不必要的对象创建,及时释放不再使用的资源,优化数据结构,避免大数据量一次性加载等。 4. **调整JVM参数**:根据应用需求合理配置JVM内存参数,避免内存分配不足或过大导致的浪费。 5. **...

    Netty 25道面试题你和答案.docx

    3. **零拷贝**:通过Direct Memory和Zero-Copy机制,提升I/O性能,减少CPU上下文切换。 4. **协议支持**:支持多种高性能序列化协议,如Protobuf,加速数据交换。 Netty 的高可靠性体现在: 1. **链路检测**:保持...

    JVM中[直接内存]的所有内容-pdf

    在JVM的内存模型中,直接内存(Direct Memory)是一个特殊的区域,虽然它并不属于标准的JVM运行时数据区,但对高性能的应用程序设计有着重要的影响。本文将深入探讨直接内存的概念、用途、优缺点以及如何进行配置。 ...

    深入理解Java源码:提升技术功底,深度掌握技术框架,快速定位线上问题

    通过直接内存(Direct Memory),Netty避免了Java堆内存的分配和释放带来的性能损失,尤其在处理大数据量时,直接内存的使用可以显著减少内存复制,进一步提高系统效率。在Java代码中,可以通过DirectByteBuffer来...

    一文搞懂JVM内存结构

    7. **直接内存(Direct Memory)**:不在JVM规范中定义,但现代JVM通常使用它来提高性能,尤其是在处理大容量数据时。通过NIO(New Input/Output)库,Java程序可以直接访问操作系统内存,避免了JVM堆的内存分配和...

    Nogc实现原理说明及相关Benchmark测试结果

    Nogc的核心是使用堆外内存,通常通过直接内存(Direct Memory)实现。它利用了Java的`sun.misc.Unsafe`类或者`java.nio`包中的ByteBuffer,这些类可以直接操作非堆内存。此外,它采用高效的并发数据结构,如使用CAS...

    scruffy-marshall_2.10-1.4.0.zip

    Scruffy-Marshall库的核心在于其对堆外内存(Direct Memory)的高效利用。在Java中,堆内存是通过JVM进行管理的,但堆外内存则直接由操作系统分配,不受JVM垃圾回收机制的影响,因此在处理大量数据时,可以避免频繁...

    基于java的开发源码-网络应用框架 Netty.zip

    7. **零拷贝(Zero-Copy)**:Netty 通过使用内存映射文件(Memory-Mapped Files)和直接缓冲区(Direct ByteBuffers)实现了零拷贝,提高了数据传输效率。 8. **线程安全**:Netty 的设计使得其在多线程环境下表现...

Global site tag (gtag.js) - Google Analytics