...
分析方法:在项目中添加```-XX:NativeMemoryTracking=detail```
JVM参数重启项目,使用命令```JVM参数重启项目,写入5分钟后,使用命令```jcmd pid VM.native_memory detail```
查看到的内存分布如下
...
可以看到堆外内存实际占用为4GB,Jprofiler看到的40MB只包含了meta space 和 code space,对我们的分析构成了严重误导!
执行的JAVA指令是:/data/fqx/jdk1.8.0_211/bin/java -Dlogback.configurationFile=./../conf/logback.xml -DIOTDB_HOME=./.. -DTSFILE_HOME=./.. -DIOTDB_CONF=./../conf -DTSFILE_CONF=./../conf -Dname=iotdb\.IoTDB -Xms2048M -Xmx100G -XX:NativeMemoryTracking=detail -Dlogback.configurationFile=./../conf/logback.xml -DIOTDB_HOME=./.. -DTSFILE_HOME=./.. -DIOTDB_CONF=./../conf -DTSFILE_CONF=./../conf -Dname=iotdb\.IoTDB -cp .........
验证方法:为了验证确实是堆外内存导致内存暴涨,我们调整-XX:MaxDirectMemorySize=2G,也就是限制堆外内存最大使用2G,发现内存使用确实下降,但是读写速度有很大的降低(30倍左右),证明IoTDB确实使用了超过2G的堆外内存,如果对堆外内存限制,则性能会有损失,下面是读最大时间的性能截图:
...