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

... 121  122  123  124  125  126  127  128  129  130  131  [132]  133  134  135  ...
NoWriterDateCnt.TitleFile(s)
1789정성태10/22/201422475오류 유형: 253. 이벤트 로그 - The client-side extension could not remove user policy settings for '...'
1788정성태10/22/201424310VC++: 82. COM 프로그래밍에서 HRESULT 타입의 S_FALSE는 실패일까요? 성공일까요? [2]
1787정성태10/22/201432582오류 유형: 252. COM 개체 등록시 0x8002801C 오류가 발생한다면?
1786정성태10/22/201434043디버깅 기술: 65. 프로세스 비정상 종료 시 "Debug Diagnostic Tool"를 이용해 덤프를 남기는 방법 [3]파일 다운로드1
1785정성태10/22/201423147오류 유형: 251. 이벤트 로그 - Load control template file /_controltemplates/TaxonomyPicker.ascx failed [1]
1784정성태10/22/201430738.NET Framework: 472. C/C++과 C# 사이의 메모리 할당/해제 방법파일 다운로드1
1783정성태10/21/201424538VC++: 81. 프로그래밍에서 borrowing의 개념
1782정성태10/21/201421296오류 유형: 250. 이벤트 로그 - Application Server job failed for service instance Microsoft.Office.Server.Search.Administration.SearchServiceInstance
1781정성태10/21/201422009디버깅 기술: 64. new/delete의 짝이 맞는 경우에도 메모리 누수가 발생한다면?
1780정성태10/15/201425896오류 유형: 249. The application-specific permission settings do not grant Local Activation permission for the COM Server application with CLSID
1779정성태10/15/201421098오류 유형: 248. Active Directory에서 OU가 지워지지 않는 경우
1778정성태10/10/201419516오류 유형: 247. The Netlogon service could not create server share C:\Windows\SYSVOL\sysvol\[도메인명]\SCRIPTS.
1777정성태10/10/201422538오류 유형: 246. The processing of Group Policy failed. Windows attempted to read the file \\[도메인]\sysvol\[도메인]\Policies\{...GUID...}\gpt.ini
1776정성태10/10/201419599오류 유형: 245. 이벤트 로그 - Name resolution for the name _ldap._tcp.dc._msdcs.[도메인명]. timed out after none of the configured DNS servers responded.
1775정성태10/9/201420837오류 유형: 244. Visual Studio 디버깅 (2) - Unable to break execution. This process is not currently executing the type of code that you selected to debug.
1774정성태10/9/201427754개발 환경 구성: 246. IIS 작업자 프로세스의 20분 자동 재생(Recycle)을 끄는 방법
1773정성태10/8/201431012.NET Framework: 471. 웹 브라우저로 다운로드가 되는 파일을 왜 C# 코드로 하면 안되는 걸까요? [1]
1772정성태10/3/201419817.NET Framework: 470. C# 3.0의 기본 인자(default parameter)가 .NET 1.1/2.0에서도 실행될까? [3]
1771정성태10/2/201428950개발 환경 구성: 245. 실행된 프로세스(EXE)의 명령행 인자를 확인하고 싶다면 - Sysmon [4]
1770정성태10/2/201422805개발 환경 구성: 244. 매크로 정의를 이용해 파일 하나로 C++과 C#에서 공유하는 방법 [1]파일 다운로드1
1769정성태10/1/201425565개발 환경 구성: 243. Scala 개발 환경 구성(JVM, 닷넷) [1]
1768정성태10/1/201420362개발 환경 구성: 242. 배치 파일에서 Thread.Sleep 효과를 주는 방법 [5]
1767정성태10/1/201425725VS.NET IDE: 94. Visual Studio 2012/2013에서의 매크로 구현 - Visual Commander [2]
1766정성태10/1/201423853개발 환경 구성: 241. 책 "프로그래밍 클로저: Lisp"을 읽고 나서. [1]
1765정성태9/30/201427504.NET Framework: 469. Unity3d에서 transform을 변수에 할당해 사용하는 특별한 이유가 있을까요?
1764정성태9/30/201423729오류 유형: 243. 파일 삭제가 안 되는 경우 - The action can't be comleted because the file is open in System
... 121  122  123  124  125  126  127  128  129  130  131  [132]  133  134  135  ...