前言
我们的Bookkeeper出现了直接内存显示异常的问题,具体的表现为,prometheus接口处返回的jvm_memory_bytes_used返回为Nan
jvm_memory_bytes_used{} Nan
定位思路
在bookkeeper中搜索代码,发现bookkeeper中的directMemory是根据netty的一个字段来进行统计的,这也就是说bookkeeper的directMemory统计,其实只能统计到netty占用的直接内存,并不能统计到程序消耗的所有堆外内存。
这个问题,我提了个issue,接下来看看如何处理 https://github.com/apache/bookkeeper/issues/2637
image-20210304172842789然后调试到这部分代码
image-20210304172935209发现这里报错,提示
java.lang.UnsupportedOperationException: Reflective setAccessible(true) disabled
需要添加java参数
-Dio.netty.tryReflectionSetAccessible=true
Netty为什么添加这个参数,是因为
Reflective setAccessible(true) will produce scary warnings on the console when using java9+, while netty still works. That said users may feel uncomfortable with these warnings, we should not try to do it by default when using java9+.
如果关闭,这使Netty无法使用其特殊方式进行调整和创建直接缓冲区,可能会有一些性能上的下降。
还是建议大家在使用jdk9以上的时候,把这个参数打开。
网友评论