Memory management Dynamics AX 2012未释放内存

Memory management Dynamics AX 2012未释放内存,memory-management,axapta,x++,dynamics-ax-2012,aot,Memory Management,Axapta,X++,Dynamics Ax 2012,Aot,我正在尝试将AOT CUS层导出为XPO文件。参考资料。我已经从上述问题的答案中得到了很好的建议,但我遇到了“内存不足”的问题。我做了一些进一步的研究和一些额外的实验。下面是我用来沿着AOT树向下爬并仅导出属于“CUS”层的节点的算法示例 private void GetAOLHelper(TreeNode baseNode、str baseExportDirectory、int currentLevel、int maxLevel) { 内特库斯莱特斯特; int CusLayerValue=4

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

private void GetAOLHelper(TreeNode baseNode、str baseExportDirectory、int currentLevel、int maxLevel)
{
内特库斯莱特斯特;
int CusLayerValue=4096;
str ExportFileName=“”;
str ExportDirectoryName=“”;
下节点树节点;
if(baseNode!=null)
{
cusLayerTest=CusLayerValue&baseNode.applObjectLayerMask();
如果(cusLayerTest>0)
{
ExportFileName=baseNode.AOTname()+“.xpo”;
this.NodeExport(baseNode、baseExportDirectory、ExportFileName);
}
其他的
{
如果(currentLevel
该算法的关键如下:我想沿着AOT树(从特定节点开始)向下爬,导出任何“CUS”层对象的层。我在“maxlevel”停止爬树,这意味着我只能深入树的X层。我目前只在AOT树的“数据字典”节点上运行此算法


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

TreeNode对象不会像大多数其他对象那样进行垃圾收集。你必须自己释放它。处理完节点后调用
treeNodeRelease()

TreeNode对象不像大多数其他对象那样进行垃圾收集。你必须自己释放它。处理完节点后,请调用
treeNodeRelease()

谢谢!我认为这次发布有点帮助,但我的内存需求仍然非常高。我想知道当我执行nextnode=nextnode.AOTnextSibling()时,是否会丢失对对象的引用。我的内存只有970 MB,内存为1 GB,因此treenoderelease正在释放一些内存。@ScottVercuski您可能是对的,原因是
nextSibling()
。您可以尝试使用
treenodeerator
对象来获取子节点,而不是现在的循环。然后可以为每个下一个节点调用
treeNodeRelease()
。Treenode类上有一个方法
AOTIterator()
,用于获取迭代器。奇怪的是,我在调用nextNode.AOTnextSibling()之前调用了nextNode.treeNodeRelease(),节点很好。我原以为它是空的,但它工作了,释放了内存。这是一个相当违反直觉的名称,因为我预期treeNodeRelease会实际破坏节点,但事实似乎并非如此。看来这只是将它设置为垃圾收集器出现时释放。谢谢!我认为这次发布有点帮助,但我的内存需求仍然非常高。我想知道当我执行nextnode=nextnode.AOTnextSibling()时,是否会丢失对对象的引用。我的内存只有970 MB,内存为1 GB,因此treenoderelease正在释放一些内存。@ScottVercuski您可能是对的,原因是
nextSibling()
。您可以尝试使用
treenodeerator
对象来获取子节点,而不是现在的循环。然后可以为每个下一个节点调用
treeNodeRelease()
。Treenode类上有一个方法
AOTIterator()
,用于获取迭代器。奇怪的是,我在调用nextNode.AOTnextSibling()之前调用了nextNode.treeNodeRelease(),节点很好。我原以为它是空的,但它工作了,释放了内存。这是一个相当违反直觉的名称,因为我预期treeNodeRelease会实际破坏节点,但事实似乎并非如此。它似乎只是将它设置为在垃圾收集器出现时释放。
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;
            }
        }
    }
}