使用TensorFlow for Java进行内存泄漏

以下测试代码泄漏内存:
private static final float[] X = new float[]{1,2,3,4,5,6,7,8,9,1,0};

public void testTensorFlowMemory() {
    // create a graph and session
    try (Graph g = new Graph(); Session s = new Session(g)) {
        // create a placeholder x and a const for the dimension to do a cumulative sum along
        Output x = g.opBuilder("Placeholder","x").setAttr("dtype",DataType.FLOAT).build().output(0);
        Output dims = g.opBuilder("Const","dims").setAttr("dtype",DataType.INT32).setAttr("value",Tensor.create(0)).build().output(0);
        Output y = g.opBuilder("Cumsum","y").addInput(x).addInput(dims).build().output(0);
        // loop a bunch to test memory usage
        for (int i=0; i<10000000; i++){
            // create a tensor from X
            Tensor tx = Tensor.create(X);
            // run the graph and fetch the resulting y tensor
            Tensor ty = s.runner().Feed("x",tx).fetch("y").run().get(0);
            // close the tensors to release their resources
            tx.close();
            ty.close();
        }

        System.out.println("non-threaded test finished");
    }
}

有什么明显的东西我做错了吗?基本流程是在该图形上创建图形和会话,创建占位符和常量,以便在以x为单位的张量上执行累积和.运行生成的y操作后,我关闭x和y张量以释放其内存资源.

我相信到目前为止帮助的事情:

>这不是Java对象内存问题.根据jvisualvm,堆不会增长,JVM中的其他内存不会增长.根据Java的本机内存跟踪,似乎不是JVM内存泄漏.
>关闭操作正在帮助,如果他们不在那里,内存会突飞猛进.随着它们到位,它仍然会变得非常快,但几乎与没有它们一样多.
> cumsum运算符并不重要,它也适用于sum和其他运算符
>它发生在带有TF 1.1的Mac OS和带有TF 1.1和1.2_rc0的CentOS 7上
>评论Tensor ty线可以消除泄漏,因此它似乎在那里.

有任何想法吗?谢谢!此外,here’s a Github project that demonstrates this issue同时进行了线程测试(以更快地增长内存)和无线测试(以显示它不是由于线程).它使用maven,可以简单地运行:

mvn test

解决方法

我相信确实存在泄漏(特别是缺少对应于 allocation in JNI code的TF_DeleteStatus)(感谢您重现的详细说明)

我鼓励你在http://github.com/tensorflow/tensorflow/issues提出问题
并希望它应该在最终的1.2版本之前修复.

(相关地,由于Tensor.create(0)创建的Tensor对象未被关闭,因此循环外部也有泄漏)

更新:这是固定的,1.2.0-rc1应该不再有这个问题.

相关文章

ArrayList简介:ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增...
一、进程与线程 进程:是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。 线程...
本文为博客园作者所写:&#160;一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/ 简单的一个类...
#############java面向对象详解#############1、面向对象基本概念2、类与对象3、类和对象的定义格式4、...
一、什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错。在java中,阻止当前方法或作用域...
Collection接口 Collection接口 Collection接口 Collection是最基本的集合接口,一个Collection代表一组...