记录TensorFlow堆外内存泄露
Java应用程序:
- 1、框架是用
Vertx-web搭建的,有自己实现的IoC和AOP。
- 2、项目引用了
TensorFlow的包。
问题排查过程
- 1、使用
top命令查看进程占用资源情况,该Java进程占用内存超过7G,而且还会出现因内存占用过大,强制被关闭进程的情况。
- 2、使用
jmap -heap [pid]查询堆信息,Eden区、存活区和老年代的容量都不大。使用jstat -gc [pid]查看gc信息,gc正常,而且metaspace的容量也很正常。由此可知,堆的情况是正常的。
- 3、怀疑可能是堆外内存泄露。怀疑是使用
Netty不当导致堆外内存泄露,Vertx-web底层使用Netty实现,但其他使用了Vertx-web的项目并未出现该情况,暂时排除。
- 4、怀疑是TensorFlow加载模型可能存在内存泄露,参考github.com/ZhuanZhiCod…,经实际验证,是由于
Tensor对象未释放资源。查看Tensor类的源码,Tensor类实现了AutoCloseable接口,可以通过try-with-resources的方式去释放Tensor对象的资源。经此修改后,Java应用服务已经正常,不会再出现内存泄露的问题。