2014-04-15 1 views
1

이전에 C#으로 간단한 전체 TCP 연결 스캐너를 작성하여 DLL에 컴파일했습니다. PSObjects를 파이프 라인에 뿌려 스캔 결과를 표시합니다. CIDR/16 서브넷을 스캔하는 경우 작업 관리자에 따라 512MBi로 돌아 오는 데이터 양이 많습니다. 나는 다른 작업을위한 여유 공간을 확보하기 위해 결과를 분석 한 후에이 메모리 사용량을 할당 해제하는 방법을 찾고 싶습니다. (우리는 8 GiB 미만의 메모리로 작업해야합니다 ...). 문제는 PowerShell이이 메모리를 보류 해제 할 수 없다는 것입니다. 누구든지이 메모리 사용을 해제하는 좋은 방법을 알고 있습니까?PowerShell 3.0 및 2.0에서 메모리 할당을 해제 할 수 없습니다.

변수를 $ null, Remove-Variable로 설정하고 [GC] :: Collect()를 호출했지만 작업 관리자의 메모리 사용량이 같은 (이상) 수준으로 유지됩니다. 나는이 겉으로보기에는 단순한 일로 손실에 처해있다. 어쩌면 메모리가 할당 해제되었지만 작업 관리자가 이전 할당을보고합니다.

답변

3

관리되는 메모리의 유일한 할당 해제가 CLR 가비지 수집기에 의해 수행됩니다. GC 수집을 이미 시도 했으므로 관리되는 메모리가 있다고 가정합니다. 즉, 개체를 참조하는 모든 루트를 찾지 못했습니다. RedGate의 메모리 프로파일 러 또는 무료 ClrProfiler와 같은 도구를 사용하여 사용자가 작성한 객체를 계속 참조하고 있는지 확인하십시오. Visual Studio 2013조차도 덤프 파일에서 관리되는 메모리를 분석 할 수 있다고 생각합니다. 이는 또한 데이터 객체에 대한 참조를 보유하고있는 모든 객체를 찾는 데 도움이 될 수 있습니다. BTW 귀하의 개체 중 네이티브 리소스 (핸들, 메모리 등) 래핑합니까?

+0

그건 그냥 내 물건의 모든 원시 또는 안전하지 않은 코드를 래핑하지 ... 나는 어떤 PInvoke, 버퍼에서 읽기, 또는 버퍼에 쓰기 않습니다. 오버플로를 유발할 수있는 것은 거의 없습니다. – user2400203

관련 문제