Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

단일 메서드 내에서의 할당으로 알아보는 자바와 닷넷의 GC 차이점

(엄밀히, 이 글의 제목은 JVM과 CLR의 GC 차이점이어야 합니다. ^^)

요즘, 사내에서 4명의 개발자들이 모여 다음 책으로 스터디를 진행하고 있습니다.

프로그래밍 대회에서 배우는 알고리즘 문제 해결 전략 세트 전2권 
; http://www.yes24.com/24/goods/8006522

스터디라고는 하지만, 진행 방식은 그냥 책을 읽지 않고 문제를 풀고, 그 후 해법을 보자는 식입니다. 그리고, 해법을 안 본 상태에서 풀은 문제를 특정 요일에 모여서 같이 보고 리뷰를 하는 정도입니다. (각자 다양한 시각에서의 문제 풀이 방식이 나와서 나름 재미가 있습니다. ^^)

풀이에 사용한 언어는 2명이 C++이고, 한 명은 Python, 나머지 한 명은 Java입니다.

그러다 보니 자연스럽게 언어 간의 특징들이 나오는데요. 재미있는 것은 Java의 GC 방식이었습니다. 가령 다음과 같이 코딩을 한 경우,

package com.company;

public class Main {

    public static void main(String[] args) {
        byte [] buf = null;

        while (true)
        {
            buf = new byte[1024 * 1024];
        }
    }
}

일반적이라면, while 문 내의 buf 할당이 끊임없이 root reference가 없는 상황이 나오므로 GC가 발생하면서 메모리가 그다지 높게 올라가는 상황이 없어야 합니다.

하지만, 컴파일하고 실행해 보면,

c:\temp>"C:\Program Files\Java\jdk1.8.0_77\bin\java" com.company.Main

for_gc_test_1.png

메모리가 2GB를 훌쩍 넘어 버립니다. (다행히, 저 상태에서 계속 유지되기는 합니다.) 위에서는 다소 극단적인 상황을 설정했지만, 이런 GC의 동작은 https://algospot.com/의 일부 문제들을 풀다 보면 메모리 제한으로 인해 정답 처리가 안되는 경우가 있습니다.

위의 현상을 경험한 자바 개발자가... 닷넷도 이러냐고 질문했습니다.

그럼, 간단하게 테스트를 해 볼까요? ^^

class Program
{
    static void Main(string[] args)
    {
        byte[] buf = null;

        while (true)
        {
            buf = new byte[1024 * 1024];
        }
    }
}

for_gc_test_2.png

보시는 바와 같이 7MB 정도를 유지하면서 (엄청 안정적으로) 운영됩니다. ^^




Java 개발자들과 종종 이야기하다보면, GC의 성능 이슈에 대해 유독 민감하다는 것을 느끼곤 합니다. 닷넷 개발자들에게는 그런 면들이 다소 생소할 정도인데요. 대부분의 ASP.NET 개발자라면 느끼겠지만, 닷넷의 경우 GC 문제는 성능 이슈에서 발생하는 경우가 그다지 많지 않습니다. 게임 개발자 정도가 아니고서는, 아마 닷넷에서 GC 신경쓰면서 개발하는 경우는 거의 없다고 봐도 무방할 정도인데, Java는 그렇지 않은 것입니다. 물론, Java의 경우 MAX 한도를 정해놓고 쓰는 경우가 많고 프로세스를 쉽게 내렸다 올릴 수 없을 정도로 WAS가 무겁다 보니 더 그런 이슈가 생기는 듯 합니다.

그나저나... 저런 단순 루프 문으로 Commit 메모리가 2.7GB까지 올라간다는 것은 좀 충격적이군요.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 8/9/2016]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2017-07-31 12시38분
정성태

1  2  3  4  5  6  7  8  9  10  11  12  13  14  [15]  ...
NoWriterDateCnt.TitleFile(s)
13256정성태2/10/20235187개발 환경 구성: 665. WSL 2의 네트워크 통신 방법 - 두 번째 이야기
13255정성태2/10/20234520오류 유형: 845. gihub - windows2022 이미지에서 .NET Framework 4.5.2 미만의 프로젝트에 대한 빌드 오류
13254정성태2/10/20234405Windows: 223. (WMI 쿼리를 위한) PowerShell 문자열 escape 처리
13253정성태2/9/20235181Windows: 222. C# - 다른 윈도우 프로그램이 실행되었음을 인식하는 방법파일 다운로드1
13252정성태2/9/20234004오류 유형: 844. ssh로 명령어 수행 시 멈춤 현상
13251정성태2/8/20234458스크립트: 44. 파이썬의 3가지 스레드 ID
13250정성태2/8/20236277오류 유형: 843. System.InvalidOperationException - Unable to configure HTTPS endpoint
13249정성태2/7/20235121오류 유형: 842. 리눅스 - You must wait longer to change your password
13248정성태2/7/20234170오류 유형: 841. 리눅스 - [사용자 계정] is not in the sudoers file. This incident will be reported.
13247정성태2/7/20235071VS.NET IDE: 180. Visual Studio - 닷넷 소스 코드 디버깅 중 "Decompile source code"가 동작하는 않는 문제
13246정성태2/6/20234199개발 환경 구성: 664. Hyper-V에 설치한 리눅스 VM의 VHD 크기 늘리는 방법 - 두 번째 이야기
13245정성태2/6/20234771.NET Framework: 2093. C# - PEM 파일을 이용한 RSA 개인키/공개키 설정 방법파일 다운로드1
13244정성태2/5/20234127VS.NET IDE: 179. Visual Studio - External Tools에 Shell 내장 명령어 등록
13243정성태2/5/20234976디버깅 기술: 190. windbg - Win32 API 호출 시점에 BP 거는 방법 [1]
13242정성태2/4/20234420디버깅 기술: 189. ASP.NET Web Application (.NET Framework) 프로젝트의 숨겨진 예외 - System.UnauthorizedAccessException
13241정성태2/3/20233920디버깅 기술: 188. ASP.NET Web Application (.NET Framework) 프로젝트의 숨겨진 예외 - System.IO.FileNotFoundException
13240정성태2/1/20234076디버깅 기술: 187. ASP.NET Web Application (.NET Framework) 프로젝트의 숨겨진 예외 - System.Web.HttpException
13239정성태2/1/20233738디버깅 기술: 186. C# - CacheDependency의 숨겨진 예외 - System.Web.HttpException
13238정성태1/31/20235821.NET Framework: 2092. IIS 웹 사이트를 TLS 1.2 또는 TLS 1.3 프로토콜로만 운영하는 방법
13237정성태1/30/20235480.NET Framework: 2091. C# - 웹 사이트가 어떤 버전의 TLS/SSL을 지원하는지 확인하는 방법
13236정성태1/29/20235090개발 환경 구성: 663. openssl을 이용해 인트라넷 IIS 사이트의 SSL 인증서 생성
13235정성태1/29/20234647개발 환경 구성: 662. openssl - 윈도우 환경의 명령행에서 SAN 적용하는 방법
13234정성태1/28/20235729개발 환경 구성: 661. dnSpy를 이용해 소스 코드가 없는 .NET 어셈블리의 코드를 변경하는 방법 [1]
13233정성태1/28/20237057오류 유형: 840. C# - WebClient로 https 호출 시 "The request was aborted: Could not create SSL/TLS secure channel" 예외 발생
13232정성태1/27/20234809스크립트: 43. uwsgi의 --processes와 --threads 옵션
13231정성태1/27/20233738오류 유형: 839. python - TypeError: '...' object is not callable
1  2  3  4  5  6  7  8  9  10  11  12  13  14  [15]  ...