2010-05-07 1 views
2

.Net 프레임 워크가 서버 환경에서 가비지 수집/메모리 제한과 관련하여 다르게 작동 할 수 있습니까? 명시 적으로 x86 컴파일 된 애플 리케이션을 32 기가 바이트 서버와 함께 32 기가 바이트 서버에서 실행하고 있는데 메모리가 부족합니다 (SystemOutOfMemoryException).하지만 그 특정 응용 프로그램이 실행 중이고 서버/다른 모든 응용 프로그램이 520 메가 바이트를 사용합니다 ..하지만 내 자신의 (클라이언트 win7) 컴퓨터에서 그 동작을 재현 할 수 없습니다..Net OutOfMemory on Server 서버가 아닌 데스크탑

이제 저는이 프로그램이 메모리 집약적 인 것을 알지만, 왜 서버가 아닌 클라이언트에서 문제가 발생하는지 알고 있습니까?

+2

클라이언트가 64 비트입니까? –

+0

은 서버 2008입니까? – Knox

+0

예, 약 1.5GB 이상을 사용하는 경우 OutOfMemoryException으로부터 안전하려면 앱이 64 비트 빌드 여야합니다. – Qwertie

답변

2

거의 .NET의OutOfMemoryException는 (어느 경우) 기계가 그대로 메모리 부족있음을 의미합니다.OutOfSomeNecessaryCriticalResource은 오해의 소지가 적은 이름이었습니다.

OutOfMemoryException은 실제로 잘못된 것이 무엇이든간에 프로그래머가 특정 상황에서 특정 예외를 throw하기로 결정했다는 것을 의미합니다. 예를 들어 손상된 JPEG (또는 .Net에서 열 수없는 파일 형식)에서 Image.FromFile(...)을 호출하면 OutOfMemoryException이됩니다. .NET에서 메모리가 부족하기 때문이 아니라 문서화 된 유형의 예외가 유효하지 않기 때문에 발생합니다 파일 (내가 왜 그런지 물어 보지 마라.).

특정 문제를 디버깅하려면 OutOfMemoryException (및 위치와 시간)을 던지는 항목을 찾아야합니다. OutOfMemoryException 자체는 전혀 의미가 없습니다.

+0

하지만 대부분의 경우 'OutOfMemoryException'은 메모리 할당에 실패했음을 나타냅니다. 이것은 시스템이 실제 메모리가 부족하다는 것을 의미하는 것은 아니지만 요구 사항을 만족시키기 위해 프로세스의 가상 주소 공간에 사용 가능한 연속 메모리 공간이 충분하지 않다는 것을 의미합니다. –

+0

@ 0xA3 : 내가 말했듯이, 당신이 할 수있는 것은 'OutOfMemoryException'으로 확신 할 수있는 것이 던져진 예외의 유형입니다. 개인적으로, 내 프로그램이 32MB로 제한된 .NET CF에서도 내 프로세스에 허용되는 것보다 많은 메모리를 사용하려고했기 때문에. NET 응용 프로그램에서이 예외가 발생하지 않았습니다. – MusiGenesis

1

예, Windows 서버에서는 다른 종류의 가비지 수집기를 사용하게됩니다. 서버 스타일 응용 프로그램의 요구 사항에 맞게 조정되어 쓰레기를 덜 적극적으로 수집합니다. <gcServer> element을 사용하여 app.config 파일을 사용하여이 동작을 변경할 수 있습니다.

실제 문제가 될 가능성이 낮지 만 앱이 더 현실적인 사용 패턴을 가지고 있다고 생각합니다. 좋은 64 비트 서버를 가지고있을 때 의도적으로 x86 모드를 강요하면 가능한 한 피해야 할 것이 있습니다.

+0

-not-enfore x86과 'any cpu'/ 64bit를 사용하고 싶지만 불행히도 부모 프로세스가 64 비트 컴퓨터 일 때 작동하지 않는 일부 레거시 api/.dll 때문에 x86을 사용해야합니다. 다소 이상한 .net> co.kr> java> corba 경로를 사용하고 64 비트를 사용하면 3rd Party .net dll이로드 될 때마다 BadImageFormatException이 발생합니다. –