본문 바로가기

Java

(22)
[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자바 프로세서처럼 하드웨어와 소프트웨어를 혼합해 구현하는 경우도 있다. 자바 바이트 코드는 플랫폼에 독립적이며 모든 자바 가상 머신은 자바 가상 머신 규격에 정의된 대로 자바 바이트코드를 실행한다. 따..
[SOLID] 객체지향 설계 5원칙 - LSP LSP (Liskov substitution principle) 자료형 S가 자료형 T의 하위형이라면, 프로그램에서 자료형 T의 객체는 프로그램의 속성을 변경하지 않고 자료형 S의 객체로 교체할 수 있다. 한마디로 객체는 프로그램의 정확성을 지키면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다 라는 말이다. 다형성의 관점에서 보았을 때 하위 클래스는 인터페이스 규약을 전부 지켜야지만 다형성을 지원할 수 있다. 자바에서 자식객체는 부모객체의 모든 속성을 가지고 있으며 부모객체의 확장 버전이기 때문에 가능한 속성이다. 이러한 점 때문에 필자는 상속(inheritance)라는 표현보다 확장(extend)라는 표현을 선호한다. 코드로 예를 들어보자. public abstract class Car { String..
[SOLID] 객체지향 설계 5원칙 - OCP OCP (Open Closed Principle) 개방 폐쇄 원칙 자신의 확장에는 개방되어 있고, 주변의 변화에 대해서는 폐쇄되어 있어야한다. 소프트웨어는 확장에 대해서는 개방되어야 하지만, 변경에 대해서는 폐쇄되어야 한다. - 로버트 C. 마틴 글로는 이해하기 힘들다. 개방 폐쇄의 원칙을 지키지 않고 있는 코드를 살펴보자. public class 아반떼 { public void 앞으로간다() {} public void 뒤로간다() {} } public class 쏘나타 { public void 앞으로간다() {} public void 뒤로간다() {} } public class 사람 { private 아반떼 차량 = new 아반떼(); } 만약 클라이언트인 사람이 차량을 바꾸게 된다면 코드가 어떻게 변..