记录TensorFlow堆外内存泄露

2,248 阅读1分钟

Java应用程序:

  • 1、框架是用Vertx-web搭建的,有自己实现的IoCAOP
  • 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应用服务已经正常,不会再出现内存泄露的问题。