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