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

... 181  182  183  184  185  186  187  188  [189]  190  191  192  193  194  195  ...
NoWriterDateCnt.TitleFile(s)
227정성태4/13/200617382Team Foundation Server: 2. TFS 빌드 오류 유형 - MSBUILD: warning : Specified cast is not valid
226정성태4/13/200615368Team Foundation Server: 1. TFS 오류 유형 - TF50608: Unable to retrieve information for security object
225정성태10/17/200614912.NET Framework: 67. VS.NET 2005 도구 상자에 있는 Workflow Activity 항목의 아이콘 변경
223정성태4/13/200626197.NET Framework: 66. Microsoft .NET Framework 2.0 Configuration 수동 설치파일 다운로드1
224정성태4/13/200619752    답변글 .NET Framework: 66.1. "Microsoft .NET Framework 2.0 Configuration" MSI 설치 파일 버전파일 다운로드1
222정성태4/13/200618775.NET Framework: 65. VS.NET 2005: 파일 기반 웹 프로젝트의 "Virtual Path" 제거
220정성태4/13/200616478.NET Framework: 64. ClickOnce - 배포 시 오류 : "Error: An unexpected error occurred -- The parameter is incorrect."
219정성태4/13/200631305.NET Framework: 63. ClickOnce - 최초 실행 시 보안 경고창 없애는 방법 [1]
216정성태4/13/200618343스크립트: 8. 3월 1일 ActiveX Patch 적용 후, JS 로 수정한 임베딩 컨트롤이 여전히 비활성화 되는 문제 [2]
215정성태4/13/200619688.NET Framework: 62. ASP.NET 웹 컨트롤 렌더링 가로채기
214정성태4/13/200619030.NET Framework: 61. DateTime - DateTime = 사이의 "Month" 수 계산 [2]
213정성태4/13/200621293.NET Framework: 60. localhost 이외의 컴퓨터에서 asmx 테스트 페이지 호출 [1]
218정성태4/13/200619649    답변글 .NET Framework: 60.1. asmx 테스트 페이지를 보여주고 싶지 않을 때
211정성태4/13/200617533VS.NET IDE: 38. VS.NET 2005 - "Export Template" 메뉴
210정성태4/13/200617000.NET Framework: 59. EXE 참조 가능 - VS.NET 2005 [2]
209정성태4/13/200616483스크립트: 7. 4월 12일 ActiveX 패치 문제를 해결할 수 있는 가장 간단한 방법 [6]파일 다운로드1
208정성태10/21/200616228Windows: 1. 성태도 ^^ Vista 설치 해봤습니다.
212정성태10/20/200615771    답변글 Windows: 1.1. Vista 에서 WinFX 런타임 구동
207정성태4/13/200624803VC++: 23. VC++ RGS 파일에 사용자 정의 파라미터 추가
205정성태4/13/200621873VS.NET IDE: 37. devenv.exe를 이용한 Command Line 컴파일 [1]
204정성태5/8/200617037웹: 2. Server Unavailable - Server Application Unavailable
203정성태4/13/200615916웹: 1. IIS 설정 옵션: Verify(Check) that file exists
202정성태4/13/200615634VS.NET IDE: 36. Automatically synchronize with an Internet time server
201정성태4/13/200618697기타: 12. XMLHTTP Failure and SUS Admin
200정성태4/13/200618062.NET Framework: 58. 웹 서비스 메서드 호출 오류 유형 - text/html; charset=xxx, but expected 'text/xml'
199정성태4/13/200619390스크립트: 6. XHTML or HTML 4.01 표준 준수
... 181  182  183  184  185  186  187  188  [189]  190  191  192  193  194  195  ...