我正在嘗試將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客戶端之前,內存不會被釋放。
謝謝!我認爲這個版本有點幫助,但是我的記憶要求仍然非常高。我想知道如果我在執行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