我正在尝试将 AOT CUS 层导出为 XPO 文件。参考这个问题。我已经从上述问题的答案中提出了很好的建议,但我遇到了“内存不足”的问题。我做了一些进一步的研究和一些额外的实验。这是我用来爬下 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 客户端之前,内存不会被释放。