Dynamics AX 2012不释放内存
问题描述:
我正在尝试将AOT CUS图层导出为XPO文件。参考this question。我已经从上述问题的答案中运行了出色的建议,但我遇到了“内存不足”的问题。我已经做了一些进一步的研究和一些额外的实验。以下是我用于爬升AOT树并仅导出属于“CUS”层的节点的算法示例。Dynamics AX 2012不释放内存
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”层对象的任何层。我停止在“最高级别”爬下树,这意味着我只能在树的深处进入X级。我目前只在AOT树的“数据字典”节点上运行这个算法。
我正面临的问题是,当此作业运行时,AX32.exe进程的内存占用空间几乎为1 GB。如果我针对多个节点运行此代码,内存需求会不断攀升。我很好奇AX为什么在算法结束时不释放内存。我对Google的研究正在出现一些关于AX垃圾收集的问题。我想知道是否有办法在AX中强制垃圾收集?如果我试图导出AOT中的每个节点,我会遇到前面提到的“内存不足”异常。在关闭AX32.exe客户端之前,内存不会被释放。
答
TreeNode对象不像大多数其他对象那样被垃圾回收。你必须自己释放它。当您完成节点时,请致电treeNodeRelease()
。
谢谢!我认为这个版本有点帮助,但是我的记忆要求仍然非常高。我想知道如果我在执行nextnode = nextnode.AOTnextSibling()时是否失去对对象的引用。我的内存只有970 MB 1 GB的内存,所以treenoderelease释放了一些内存。 – 2013-03-07 17:01:10
@ScottVercuski你可能是正确的,'nextSibling()'是原因。您可以尝试使用'TreeNodeIterator'对象来获取子节点,而不是现在的循环。然后你可以为每个nextNode调用'treeNodeRelease()'。 Treenode类有一个方法'AOTIterator()'来获取迭代器。 – 2013-03-08 10:02:11
奇怪的是,我调用nextNode.treeNodeRelease()之前,我调用nextNode.AOTnextSibling()和节点是好的。我期待它是空的,但它工作并释放内存。这是一个相当反直觉的名字,因为我期望treeNodeRelease实际销毁节点,但似乎并非如此。似乎只是在垃圾收集器出现时才会发布它。 – 2013-03-08 14:59:50