본문 바로가기

Java/JVM

(8)
[JVM] Stack & Frame Stack Each Java Virtual Machine thread has a private Java Virtual Machine stack, created at the same time as the thread. A Java Virtual Machine stack stores frames (§2.6). A Java Virtual Machine stack is analogous to the stack of a conventional language such as C: it holds local variables and partial results, and plays a part in method invocation and return. ---------- 중략 ---------- If the compu..
[JVM] GC 벤치마크 결과 데이터 이번 장에서는 GC별로 벤치마크 결과 데이터를 정리한다. 용어에 대한 자세한 설명은 다루지 않는다. 분석에 필요한 대부분의 용어는 [JVM] GC 벤치마크 분석 포인트 (링크)에 적어두었다. Serial GC Instance: m5.xlarge (vCPU: 4, Memory: 16 gb) Allocated Heap: 4.94 gb (JVM에서 자동으로 설정한 값) Request Throughput: 0.51 Transactions/Seconds Total Request Count: 1,828 Error Count (Ratio): 75 (4.10%) Average CPU Usage: 1.0% (User), 0.1% (System) Core-1: 0.9% (User), 0.1% (System) Core-2:..
[JVM] GC 벤치마크 결과 벤치마크 결과 이번 장에서는 GC 벤치마크 결과를 살펴본다. 이번 장에서는 분석에 필요한 데이터를 나열해두고 분석해본다. [[JVM] GC 벤치마크 결과 (링크)]에서는 이번 장에서 다루지 않은 데이터도 따로 정리해두었다. 이번 장의 각 결과 하단에는 공식문서 및 많은 블로그를 참고하여 필자의 생각을 정리해보았다. GC 선정 결과 필자가 선정한 GC는 환경을 불문하고 Parallel GC이다. Serial GC, ZGC, CMS는 성능이 좋다하여도 사용하기 힘든 부분이 있다. (Serial GC는 고성능 서버자원을 모두 사용하지 않으며 ZGC는 필자가 개발한 서비스의 Java 버전과 맞지 않으며 CMS 는 Java 9에서 deprecated 되었기 때문이다. 실제로 결과들을 살펴보면 CMS가 가장 좋은 ..
[JVM] GC 벤치마크 분석 포인트 [JVM] GC 벤치마크 개요 (링크)에서 분석에 필요한 Dump 파일과 Log 파일을 추출하고 툴을 사용하여 보기좋게 결과를 만드는 방법까지 진행하였다. 이번 장에서는 추출한 결과 파일을 분석하는 방법에 대해서 알아본다. Heap Dump 분석 Swallow Heap: 한 객체만이 점유한 Heap의 크기 Retained Heap: 한 객체가 제거될 때 함께 제거될 수 있는 객체들이 점유한 Heap의 크기. 자신이 GC 될 때 함께 GC 될 수 있는 참조하고 있는 객체의 메모리의 크기. Unreachable Object: Heap 영역에 값이 할당되어 있지만 이를 참조하는 변수가 Stack 영역에 없는 Object Dominator Tree: 객체간 참조관계를 나타내는 Tree, Keep Alive Tr..
[JVM] GC 벤치마크 개요 이번 장에서는 자신의 프로젝트의 GC 종류를 변경하면서 벤치마크를 진행해보고 서비스에 가장 적합한 GC를 선택해본다. Jmeter, nmon, nmonchart, Pinpoint가 익숙하지 않다면 [Pinpoint] 개념 (링크), [부하 테스트] Jmeter 설정 (링크), [부하 테스트] 서버 설정 (링크) 글을 확인하고 오길바란다. GC 목록 Serial GC Parallel GC Parallel Old GC (Parallel Compacting GC) CMS (Concurrent Mark & Sweep GC) G1GC (Garbage First) ZGC 참고 EazyGC 사이트를 통해 로그를 분석하는 방법과 VisualVM을 통한 Heap & Thread Dump를 분석하는 방법과 nmonchar..
[JVM] GC 알고리즘 종류 이번 장에서는 GC 알고리즘의 종류와 작동 방식, 선정 기준에 대해서 알아본다. GC 알고리즘은 크게 Non Concurrent Collectors와 Concurrent Collectors다. Non Concurrent Collectors에는 아래의 Collector들이 있다. Serial Collector Parallel Collector Parallel Old Collector Concurrent Collectors에는 아래의 Collector들이 있다. Concurrent Mark Sweep Collector (CMS) Garbage-First Collector (G1GC) Z Collector (ZGC) 이번 진행하는 프로젝트에 맞는 Collector를 선정하기 위해 벤치마크를 진행하고 많은 문서..
[JVM] Heap & GC 이번 장에서는 Oracle 공식문서와 여러 블로그들의 글을 정리하면서 Java Heap에 대해서 알아보도록 한다. 먼저 많은 블로그들에 있는 Heap 구조를 살펴보면 아래와 같다. 그림1: Java8 이전의 메모리 구조(출처: https://asfirstalways.tistory.com/158) 그림에서 Permanent영역은 java8부터는 제거되었으며 Class나 Method의 메타 정보들이 Native Memory의 Metaspace영역으로 이동하였다. Native Memory는 Heap 영역의 바깥인 Off-Heap 공간을 의미하며 시스템의 기본 메모리라고 생각하면 된다. Java 어플리케이션은 크게 Heap영영과 Off-Heap 두 공간을 활용하여 동작한다. Off-Heap영역도 Java 어플리..
[JVM] JVM 이란? 이번 장에서는 JVM이 무엇이고 어떤 역할을 하는지 알아보도록 한다. 현재 진행 중인 프로젝트의 JVM을 튜닝하고 GC를 선택하는 과정에서 JVM에 대한 지식이 많이 부족하다는 것을 느껴서 자료들을 정리하는 시간을 가져본다. JVM (Java Virtual Machine) 이란? 위키백과에 따르면 JVM을 아래와 같이 정의하고 있다. 자바 가상 머신은 자바 바이트 코드를 실행할 수 있는 주체이다. 일반적으로 인터프리터나 JIT컴파일 방식으로 다른 컴퓨터 위에서 바이트 코드를 실행할 수 있도록 구현되나 jop자바 프로세서처럼 하드웨어와 소프트웨어를 혼합해 구현하는 경우도 있다. 자바 바이트 코드는 플랫폼에 독립적이며 모든 자바 가상 머신은 자바 가상 머신 규격에 정의된 대로 자바 바이트코드를 실행한다. 따..