내용 보기

작성자

관리자 (IP : 172.17.0.1)

날짜

2020-07-10 05:23

제목

[C#] 한 개체당 2GB 메모리 이상 허용 하기


NET은 기본적으로 개체 하나당 2GB까지의 메모리를 허용한다.

2GB가 넘을시 Out Of Memory Exception이 발생된다.

하나의 개체당 2GB 메모리를 허용할려면 app.config에 옵션을 지정해야 한다.

app.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="IntegratedManagementConsole.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<!-- 한 개체당 2GB 메모리 이상 허용 옵션 [프로젝트 옵션에서 [빌드 - 32비트 기본 사용 체크도 같이 해제해 주어야 함.]]
<runtime>
<gcAllowVeryLargeObjects enabled="true" />
</runtime>
-->
<appSettings>
<!-- 서버[Remote Service] 포트 번호 -->
<add key="DefaultRemoteServicePort" value="20388" />
<!-- 관리콘솔[Client Service] 포트 번호 -->
<add key="DefaultClientServicePort" value="20389" />
</appSettings>
<userSettings>
<IntegratedManagementConsole.Properties.Settings>
<setting name="Language" serializeAs="String">
<value>ko-kr</value>
</setting>
<setting name="RememberUserId" serializeAs="String">
<value />
</setting>
<setting name="SystemTreeSort" serializeAs="String">
<value />
</setting>
</IntegratedManagementConsole.Properties.Settings>
</userSettings>
</configuration>


다음은 MSDN 내용이다.

<gcAllowVeryLargeObjects> 요소

.NET Framework 4.5

64 비트 플랫폼에서, 전체 크기가 2기가바이트 (GB) 보다 큰 배열을 지원합니다.

<gcAllowVeryLargeObjects  
enabled="true|false" />

다음 단원에서는 특성, 자식 요소 및 부모 요소에 대해 설명합니다.

특성

attribute

설명

enabled

필수 특성입니다.

64 비트 플랫폼에서 총 크기가 2GB 보다 큰 배열은 사용할지 여부를 지정 합니다.

enabled 특성

설명

false

총 크기가 2GB 보다 큰 배열은 사용할 수 없습니다. 이 값이 기본값입니다.

true

64 비트 플랫폼에서, 총 크기가 2GB 보다 큰 배열을 사용할 수 있습니다.

자식 요소

없음

부모 요소

요소

설명

configuration

공용 언어 런타임 및 .NET Framework 응용 프로그램에서 사용하는 모든 구성 파일의 루트 요소입니다.

runtime

런타임 초기화 옵션에 대한 정보를 포함합니다.

응용 프로그램 구성 파일에서 이 요소를 사용하여 배열 크기를 2 GB 보다 큰 배열을 사용할 수 있지만, 개체 또는 배열 크기에 대한 다른 제한을 변경하지 않습니다.

  • 배열에 있는 요소의 최대 수는 UInt32.MaxValue 입니다.

  • 단일 차원에 최대 인덱스는 바이트 배열 및 단일 바이트 구조체의 배열의 경우 2,147,483,591(0x7FFFFFC7) 이고 다른 형식의 경우 2,146,435,071(0X7FEFFFFF) 입니다.

  • 문자열과 그 외 배열이 아닌 개체의 최대 크기는 변경되지 않습니다.

주의 정보 주의

이 기능을 사용하기 전에, 모든 배열의 크기가 2GB 보다 작다고 가정하는, 안전하지 않은 코드가 응용 프로그램에 포함 되지 않도록 확인하시기 바랍니다. 예를 들어, 배열을 버퍼처럼 사용하는 안전하지 않은 코드가 배열이 2GB를 초과하지 않는다는 가정하에 작성됐을 경우, 해당 코드는 버퍼 오버런에 취약할 수 있습니다.

다음 예제에서는 응용 프로그램에서 이 기능을 사용하는 방법을 보여 줍니다.

<configuration>
<runtime>
<gcAllowVeryLargeObjects enabled="true" />
</runtime>
</configuration>


출처1

출처2