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

... 166  167  168  169  170  171  172  173  174  175  176  [177]  178  179  180  ...
NoWriterDateCnt.TitleFile(s)
566정성태2/28/200825244.NET Framework: 99. AppDomain.GetEntryAssembly()를 우회하는 방법파일 다운로드1
564정성태2/16/200824788Windows: 30. TS Web Access + Vista SP1 [2]
563정성태2/16/200824164오류 유형: 51. Vista(UAC) + 웹 프로젝트 디버깅: System.UnauthorizedAccessException
562정성태2/12/200828584Windows: 29. Windows Server 2008 설치 [4]
561정성태1/10/200822280오류 유형: 50. IE 7 + 잘못된 HTC 파일 경로 = File not found [5]
559정성태1/1/200827173Windows: 28. Vista에서 끌어다 놓기로 GAC 등록하는 방법 [2]
558정성태1/1/200843794개발 환경 구성: 33. 32bit/64bit OLE DB Provider [1]
557정성태12/22/200722736개발 환경 구성: 32. WSCF와 VS.NET 2008
556정성태12/16/200720907기타: 22. 인기 순위 정리 : 조회수 1000 회 이상
555정성태12/16/200723641기타: 21. 인기 순위 정리 : 조회수 500 ~ 999회 글 목록
554정성태12/16/200728290기타: 20. 인기 순위 정리 : 조회수 250 ~ 499회 글 목록
553정성태12/16/200728533기타: 19. 인기 순위 정리 : 조회수 100 ~ 249회 글 목록
552정성태12/16/200722177기타: 18. 인기 순위 정리 : 조회수 000 ~ 099 회 글 목록
550정성태12/16/200721100Team Foundation Server: 23. TFS 2005에서 TFS 2008로 마이그레이션 [2]
549정성태12/16/200722593Team Foundation Server: 22. TFS 설정 - 주소를 도메인으로 변경
548정성태12/15/200740212오류 유형: 49. Report Server - 원격 서버에 연결할 수 없습니다
547정성태12/4/200728651.NET Framework: 98. .NET 비동기 Socket과 스레드
546정성태12/4/200719666Team Foundation Server: 21. Microsoft Office가 참조된 경우의 빌드 환경 구성
545정성태12/4/200726429Windows: 27. 눈으로 확인해 보는 ASLR 기능 [1]
544정성태11/25/200722336오류 유형: 48. VS.NET 2008 설치 오류 - Error code 1602 [5]
543정성태11/25/200725359개발 환경 구성: 31. ROBOCOPY XP026 버전 [1]
542정성태11/3/200740407VS.NET IDE: 55. XML/XSLT로 구현하는 매크로 확장 [5]파일 다운로드2
538정성태10/11/200726855스크립트: 10. VBScript - "Sub를 호출할 때는 괄호를 사용할 수 없습니다." [2]
537정성태9/28/200735487개발 환경 구성: 30. 64비트 OS에서의 ChartFX 라이선스 문제
536정성태9/12/200732289.NET Framework: 97. WCF : netTcpBinding에서의 각종 Timeout 값 설명 [11]
535정성태9/11/200729798.NET Framework: 96. WCF - PerSession에서의 클라이언트 연결 관리 [5]
... 166  167  168  169  170  171  172  173  174  175  176  [177]  178  179  180  ...