我運行一個測試函數來標識內存泄漏時:神祕內存泄漏覆蓋的靜態數據集
[TestMethod]
public void DatabaseTools_Other_MemoryTest()
{
for (int i = 0; i < 100; i++)
{
try
{
var r = DatabaseTools.GetDataSet(true);
r = null;
}
catch (Exception e)
{
int EndPoint = i;
}
}
}
這種方法的目的是調用DatabaseTools.GetDataSet(真),直到遇到一個OutOfMemoryException,發生在第三次或第四次加載期間。不過,據我所知,這應該實際上不能happen-這是DatabaseTools.GetDataSet:
public static DataSet GetDataSet(bool setData, string sqlText = null, string strConnection = null)
{
sqlText = sqlText ?? FullFilemakerQuery;
if (setData)
{
Database = strConnection;
Data = new DataSet();
}
DataSet dataSet = new DataSet();
using (SqlConnection connection = GetConnectionString())
{
using (SqlDataAdapter dataAdapter = new SqlDataAdapter(sqlText, connection))
{
dataAdapter.SelectCommand.CommandType = System.Data.CommandType.Text;
if (setData)
{
dataAdapter.FillSchema(Data, SchemaType.Source);
DisableAutoIncrement(Data);
dataAdapter.Fill(Data);
NameTables(Data, sqlText);
BuildDataKeysAndRelations(Database);
dataSet = null;
}
else
{
dataAdapter.FillSchema(dataSet, SchemaType.Source);
DisableAutoIncrement(dataSet);
dataAdapter.Fill(dataSet);
NameTables(dataSet, sqlText);
}
}
connection.Close();
}
return dataSet ?? Data;
}
public static void NameTables(DataSet dataSet, string sqlText)
{
for (int i = 0; i < dataSet.Tables.Count; i++)
{
dataSet.Tables[i].TableName = sqlText.Split(';')[i].Split(Dividers, StringSplitOptions.None)[1].Trim();
}
}
public static void DisableAutoIncrement(DataSet data)
{
foreach (DataTable T in data.Tables)
{
T.PrimaryKey.Select(c => { c.AutoIncrement = false; return c; }).ToList();
}
}
當只傳遞「真」這個功能,它集SQLTEXT等於靜態FullFileMakerQuery它選擇的一切程序可以從數據庫中使用,然後獲得默認的數據庫名稱(數據庫有一個自定義設置器,當給定一個空值或空值時,它將自己設置爲默認值),並將靜態數據設置爲新的數據集。我們已經嘗試在此處將其設置爲null(沒有更改),並且我們嘗試使用導致錯誤的Data.Dispose()。因爲這個函數也可以返回數據集,而不需要設置全局數據,所以我們初始化一個新的DataSet數據集。然後我們執行標準連接,數據適配器,fillchema,加載數據。
的古怪:通過在存儲器測試功能設置斷點和保存轉儲,加載數據集一次,將存儲器的某個量,重裝它使用更少存儲器(約36000字節System.Data.Common.StringStorage)然後再次重新加載使用更多內存(在與之前相同的地方大約120,000字節)。如果我們重新加載一次,它由於OutOfMemoryException而使用更多的內存和崩潰,此時我不知道是什麼導致了它。
我懷疑'BuildDataKeysAndRelations'方法。你能展示那種方法的內容嗎? –
你在這裏混雜着:獲取數據和保存數據。如果你想分開這兩個問題,你會有一個更清潔的程序(並且更容易看到錯誤)。 – nvoigt
@ThariqNugrohotomo我也是這樣做的,但註釋掉這行對內存泄漏沒有影響。 –