观察NIO的direct memory使用量?

前几天有同事问起,我本来印象中是有啥别的办法的,但想不起来了。
再看了看[url=http://hg.openjdk.java.net/jdk6/jdk6/jdk/file/tip/src/share/classes/java/nio/Bits.java]NIO相关部分的源码[/url]觉得貌似就这个办法靠谱(在Oracle/Sun的JDK上):
[url=http://stackoverflow.com/questions/3908520/looking-up-how-much-direct-buffer-memory-is-available-to-java]StackOverflow: Looking up how much direct buffer memory is available to Java?[/url]
通过反射获取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参数叫做[b]MaxDirectMemorySize[/b],但实际上HotSpot VM并没使用这个参数,而是直接把它交给Java层,由NIO的Java部分来使用它。NIO的direct memory的分配和释放过程也没啥JMX之类的监控,完全是裸的,除了反射去暴力获取数据我还真不知道有啥办法了。

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

这么重要的数据居然没有合适的API去监控,真不爽…
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值