【问题标题】:Dynamics AX 2012 not releasing memoryDynamics AX 2012 不释放内存
【发布时间】:2013-03-07 15:05:04
【问题描述】:

我正在尝试将 AOT CUS 层导出为 XPO 文件。参考this question。我已经从上述问题的答案中提出了很好的建议,但我遇到了“内存不足”的问题。我做了一些进一步的研究和一些额外的实验。这是我用来爬下 AOT 树并仅导出属于“CUS”层的节点的算法示例。

private void GetAOLHelper(TreeNode baseNode, str baseExportDirectory, int currentLevel, int maxLevel)
{
    int cusLayerTest;
    int CusLayerValue = 4096;
    str ExportFileName = "";
    str ExportDirectoryName = "";
    TreeNode nextNode;

    if (baseNode != null)
    {
        cusLayerTest = CusLayerValue & baseNode.applObjectLayerMask();
        if (cusLayerTest > 0)
        {
            ExportFileName = baseNode.AOTname() + ".xpo";
            this.NodeExport(baseNode, baseExportDirectory, ExportFileName);
        }
        else
        {
            if (currentLevel < maxLevel)
            {
                nextNode = baseNode.AOTfirstChild();
                while (nextNode != null)
                {
                    this.GetAOLHelper(nextNode, baseExportDirectory, currentLevel + 1, maxLevel);
                    nextNode = nextNode.AOTnextSibling();
                }
                nextNode = null;
            }
        }
    }
}

这个算法的症结如下:我想爬下 AOT 树(从特定节点开始)并导出任何作为“CUS”层对象的层。我在“maxlevel”停止爬下树,这意味着我只深入树 X 层。我目前只在 AOT 树的“数据字典”节点上运行此算法。

我面临的问题是,当此作业运行时,AX32.exe 进程的内存占用量几乎为 1 GB。如果我对多个节点运行此代码,则内存需求会不断攀升。我很好奇为什么 AX 在算法完成后没有释放内存。我对 Google 的研究提出了一些与 AX 垃圾收集有关的问题。我想知道是否有办法在 AX 中强制进行垃圾收集?如果我尝试导出 AOT 中的每个节点,我会遇到前面提到的“内存不足”异常。在我关闭 AX32.exe 客户端之前,内存不会被释放。

【问题讨论】:

    标签: memory-management axapta x++ dynamics-ax-2012 aot


    【解决方案1】:

    TreeNode 对象不像大多数其他对象那样被垃圾收集。你必须自己释放它。完成节点后,请致电 treeNodeRelease()

    【讨论】:

    • 谢谢!我认为该版本有所帮助,但我的内存要求仍然非常高。我想知道当我执行 nextnode = nextnode.AOTnextSibling() 时是否丢失了对对象的引用。我的内存只有 970 MB 而不是 1 GB,因此 treenoderelease 正在释放一些内存。
    • @ScottVercuski 你可能是对的,nextSibling() 是原因。您可以尝试使用 TreeNodeIterator 对象来获取子节点,而不是您现在拥有的循环。然后你可以为每个 nextNode 调用treeNodeRelease()。 Treenode 类上有一个方法AOTIterator() 来获取迭代器。
    • 奇怪的是,我在调用 nextNode.AOTnextSibling() 之前调用了 nextNode.treeNodeRelease() 并且节点很好。我原以为它是空的,但它工作并释放了内存。这是一个相当违反直觉的名称,因为我预计 treeNodeRelease 会实际销毁节点,但似乎并非如此。似乎只是将其设置为在垃圾收集器出现时释放。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多