观察NIO的direct memory使用量?

前几天有同事问起,我本来印象中是有啥别的办法的,但想不起来了。
再看了看 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去监控,真不爽…

你可能感兴趣的:(java,jvm,jdk,oracle,groovy)