TypeScript的Memory leak

在C++语言里面,申明了一个对象,当代码走出了对象的作用域的时候,这个对象的析构函数会被调用,因而给用户提供了自主释放资源的机会,无论这个资源是位于内存还是显存,都没有关系。

譬如下面的代码,String a1的资源释放过程是:先调用析构函数String::~String,然后释放a1 对象本身(譬如size,vtable等)。

#include 
#include 
using namespace std;
 
class String 
{ 
private: 
    char *s; 
    int size; 
public: 
    String(const char *); // constructor 
    ~String();      // destructor 
}; 
  
String::String(const char *c) 
{ 
    size = strlen(c); 
    s = new char[size+1]; 
    strcpy(s,c); 
} 

String::~String() 
{   
    cout << "~String" << endl;
    delete []s; 
} 
 
void testString() {
    String a1("Hello");    
}

int main()
{
    cout<<__FUNCTION__<<","<<__LINE__<

TFJS的Tensor,如果它纯粹的管理一些CPU上面的资源,其实不用担心内存泄漏的。V8的资源回收机制可以保证这一点。
但是,如果是基于WebGL或者WebGPU运行,Tensor里面有部分资源来自GPU的,这个时候,V8的垃圾回收机制就没有用了。这个时候,就需要用户自己管理GPU内存。
同样的理由,V8由于是自己管理内存,所以JavaScript的对象,并没有提供析构函数。这个时候,麻烦就来了:需要用户合适的时机调用函数来释放GPU资源。
或者说,我认为有必要修改一下spec,有机制保证这些GPU资源在不再需要的时候,能够自动释放,类似于C++的析构函数。
对TFJS而言,这个函数就是Tensor.dispose。

在这一点,相比较C++,TypeScript有点简陋(需要手动调用dispose):

  it('reshape is functional', async () => {
    const a = tf.scalar(2.4);
    const b = a.reshape([]);
    b.dispose();
    expectArraysClose(await a.data(), [2.4]);
  });

你可能感兴趣的:(TensorFlowJS)