테이블 Newrow ()는 메모리 누출을 유발합니다
-
04-07-2019 - |
문제
메모리 누출을 조사하는 동안 나는 루프 내부의 테이블에서 Newrow ()에게 전화하여 여러 번 전화하여 발생한다는 것을 알게되었습니다. 그러나 생성 된 Datarow는 테이블 행 컬렉션에 결코 추가되지 않았으며 테이블 행 카운트는 결코 0을 초과하지 않았습니다.
내 질문은 새로 생성 된 Datarow가 행에 추가되지 않더라도 Newrow가 호출 될 때마다 더 많은 메모리를 사용하는 이유입니다. Newrow에서 반환 된 Datarow는 항상 동일한 로컬 변수에 할당됩니다 (따라서 마지막 New Row를 폐기하는 것 같습니다. ).
코드가 테이블에 추가되지 않는 DataRows를 생성하는 이유를 무시하십시오!
해결책
DataRow는 데이터 가능에서 스키마를 상속하므로 Datarow에서 행을 생성 한 테이블 스키마에 대한 참조가 있습니다. 새 행은 테이블의 분리 상태에 있습니다.
이것이 바로 GC가 새로운 사용하지 않은 행을 단독으로 떠난 이유입니다.
다른 팁
DataTable.newrow ()는 생성 된 행을 DataTable의 레코드 메너에 추가합니다. 왜 이런 일이 일어나는지 확실하지는 않지만 이것이 GC에 의해 해방되지 않은 이유입니다.
Datarow를 제거하는 방법에는 두 가지가있는 것으로 보입니다.
- 테이블에 추가 한 다음 삭제하십시오.
- dataTable.clear ()를 호출하십시오.
두 가지 문제가 관련되어 있다고 생각합니다.
Table.Newrow는 초기 테이블과 동일한 열 형식을 가진 새 데이터 행을 만듭니다.
이 새 행은 Table.rows.add (Newrow)를 사용하여 테이블에 추가해야합니다. 루프는 사용되지 않은 객체를 만들어 메모리를 먹게됩니다. 자세한 내용은이 기사를 참조하십시오http://msdn.microsoft.com/en-us/library/system.data.datatable.newrow.aspx
newrow = table.newrow ()를 만들고 아래 코드 에서이 Newrow보다 더 필요하지 않습니다. 1) 테이블에 행을 추가하십시오. 2) 제거하면 메모리 누출을 방지합니다.
var table = new DataTable();
while (true)
{
var newRow = table.NewRow();
table.Rows.Add(newRow); //Without this 2 rows you will have memory leak.
table.Rows.Remove(newRow);//
}