观察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>groovyshGroovy 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===> 0groovy:000> Bits.maxMemory===> 67108864groovy:000> buf = ByteBuffer.allocateDirect(4096)===> java.nio.DirectByteBuffer[pos=0 lim=4096 cap=4096]groovy:000> Bits.reservedMemory===> 4096groovy:000> Bits.maxMemory===> 129761280groovy:000> buf.direct===> truegroovy:000> buf.hasArray()===> falsegroovy:000> buf.cleaner().clean()===> nullgroovy:000> Bits.reservedMemory===> 0groovy:000> Bits.maxMemory===> 129761280groovy: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去监控,真不爽…