调用超过13个参数的函数时IronPython内存泄漏

时间:2011-02-09 15:46:24

标签: function memory-leaks ironpython

我正在使用IronPython 2.6.2 for .NET 4.0作为C#/ WPF应用程序中的脚本平台。脚本可以包括它们自己的函数定义,类定义等。我不限制可以写的内容。

脚本更改后,脚本文件中出现了内存泄漏。在评论出越来越多的代码之后,我们确定定义和调用超过13个参数的函数会导致内存泄漏。因此,如果你调用一个带有14个参数的函数,IronPython就会泄漏。

以下是每100毫秒运行一次的计时器示例代码:

  _Timer.Enabled = false;
  try
  {
    var engine = Python.CreateEngine();
    engine.Execute("def SomeFunc(paramI, paramII, paramIII, paramIV, paramV, paramVI, paramVII, paramVIII, paramIX, paramX, paramXI, paramXII, paramXIII, paramXIV):\r\n\tpass\r\nSomeFunc(1,2,3,4,5,6,7,8,9,10,11,12,13,14)");
    //engine.Execute("def SomeFunc(paramI, paramII, paramIII, paramIV, paramV, paramVI, paramVII, paramVIII, paramIX, paramX, paramXI, paramXII, paramXIII):\r\n\tpass\r\nSomeFunc(1,2,3,4,5,6,7,8,9,10,11,12,13)");

    // With and without the following line makes no difference
    engine.Runtime.Shutdown();

    this.Dispatcher.Invoke((Action)delegate()
    {
      this.Title = DateTime.Now.ToString();
    });

  }
  catch (Exception)
  {


  }
  _Timer.Enabled = true;

请注意,我有一个14参数版本的脚本,下面是一个注释掉的13参数版本。 Python脚本基本上是这样的:

    def SomeFunc(paramI, paramII, paramIII, paramIV, paramV, paramVI, paramVII, paramVIII, paramIX, paramX, paramXI, paramXII, paramXIII, paramXIV):
        pass
    SomeFunc(1,2,3,4,5,6,7,8,9,10,11,12,13,14)

我尝试过使用和不使用engine.Runtime.Shutdown()但它没有任何区别。 14参数版本的内存将快速攀升,13参数版本的内存将略微攀升然后稳定下来。

有什么想法吗?

由于 - 肖恩

1 个答案:

答案 0 :(得分:1)

IronPython中有一些神奇的参数 - 少于一个不同(更快)的代码路径而不是更多。听起来后备代码中仍然存在一些错误。你能用一个独立的测试用例来open an issue吗?

查看最新的代码,我认为边界将是15.您可以再试一次2.7 Beta 2并查看结果是否相同?