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분
정성태

... 61  62  63  64  65  66  67  68  69  70  71  72  73  74  [75]  ...
NoWriterDateCnt.TitleFile(s)
11765정성태10/26/201812104개발 환경 구성: 420. Visual Studio Code - Arduino Board Manager를 이용한 사용자 정의 보드 선택
11764정성태10/26/201815722개발 환경 구성: 419. MIT 라이선스로 무료 공개된 Detours API 후킹 라이브러리 [2]
11763정성태10/25/201813660사물인터넷: 53. New NodeMcu v3(ESP8266)의 https 통신
11762정성태10/25/201814397사물인터넷: 52. New NodeMCU v3(ESP8266)의 http 통신파일 다운로드1
11761정성태10/25/201814066Graphics: 26. 임의 축을 기반으로 3D 벡터 회전파일 다운로드1
11760정성태10/24/201810535개발 환경 구성: 418. Azure - Runbook 내에서 또 다른 Runbook 스크립트를 실행
11759정성태10/24/201811233개발 환경 구성: 417. Azure - Runbook에서 사용할 수 있는 다양한 메서드를 위한 부가 Module 추가
11758정성태10/23/201813306.NET Framework: 800. C# - Azure REST API 사용을 위한 인증 획득 [3]파일 다운로드1
11757정성태10/19/201810781개발 환경 구성: 416. Visual Studio 2017을 이용한 아두이노 프로그램 개발(및 디버깅)
11756정성태10/19/201813066오류 유형: 500. Visual Studio Code의 아두이노 프로그램 개발 시 인텔리센스가 안 된다면?
11755정성태10/19/201814719오류 유형: 499. Visual Studio Code extension for Arduino - #include errors detected. [1]
11754정성태10/19/201811565개발 환경 구성: 415. Visual Studio Code를 이용한 아두이노 프로그램 개발 - 새 프로젝트
11753정성태10/19/201819018개발 환경 구성: 414. Visual Studio Code를 이용한 아두이노 프로그램 개발
11752정성태10/18/201811244오류 유형: 498. SQL 서버 - Database source is not a supported version of SQL Server
11751정성태10/18/201811379오류 유형: 497. Visual Studio 실행 시 그래픽이 투명해진다거나, 깨진다면?
11750정성태10/18/201810176오류 유형: 496. 비주얼 스튜디오 - One or more projects in the solution were not loaded correctly.
11749정성태10/18/201811596개발 환경 구성: 413. 비주얼 스튜디오에서 작성한 프로그램을 빌드하는 가장 쉬운 방법
11748정성태10/18/201812513개발 환경 구성: 412. Arduino IDE를 Store App으로 설치한 경우 컴파일만 되고 배포가 안 되는 문제
11747정성태10/17/201812673.NET Framework: 799. C# - DLL에도 EXE처럼 Main 메서드를 넣어 실행할 수 있도록 만드는 방법파일 다운로드1
11746정성태10/15/201811925개발 환경 구성: 411. Bitvise SSH Client의 인증서 모드에서 자동 로그인 방법파일 다운로드1
11745정성태10/15/201810480오류 유형: 495. TFS 파일/폴더 삭제 - The item [...] could not be found in your workspace, or you do not have permission to access it.
11744정성태10/15/201811081개발 환경 구성: 410. msbuild로 .pubxml 설정에 따른 배포 파일을 만드는 방법
11743정성태10/15/201811740웹: 37. Bootstrap의 dl/dt/dd 조합에서 문자열이 잘리지 않도록 CSS 설정
11742정성태10/15/201817397스크립트: 13. 윈도우 배치(Batch) 스크립트에서 날짜/시간 문자열을 구하는 방법
11741정성태10/15/201811764Phone: 13. Android - LinearLayout 간략 설명
11740정성태10/15/201813989사물인터넷: 51. Synology NAS(DS216+II)를 이용한 원격 컴퓨터의 전원 스위치 제어
... 61  62  63  64  65  66  67  68  69  70  71  72  73  74  [75]  ...