반응형

Java 51

Spring MVC와 WebFlux의 차이

Spring WebFlux Spirng WebFlux는 Event driven 방식이고 비동기 논블로킹 방식입니다. WebFlux는 Node.js처럼 이벤트 루프가 돌아서 요청이 발생할 경우 그것에 맞는 핸들러에게 처리를 위임하고 처리가 완료되면 callback 메소드 등을 통해 응답을 반환합니다. 그래서 이 방식의 경우 Spirng MVC에 비해 적은 스레드로 많은 사용자의 요청을 받아낼 수 있습니다. Spirng MVC Spring Mvc는 사용자의 요청이 들어왔을 때마다 Thread를 생성하여 요청을 처리합니다. 하지만 다수의 사용자 요청이 들어왔을 때, Thread를 계속 생성하는 것은 리소스가 굉장히 많이 들어갑니다. 그래서 Spring MVC의 경우 어플리케이션이 실행되면서 Thread Poo..

Java/Spring 2021.10.29

G1 GC

G1 GC란 G1 GC는 대용량의 메모리가 있는 멀티 프로세서 시스템을 위해 제작되었습니다. 빠른 처리 속도를 달성하면서 pause의 최소화를 충족시키는 것이 G1 GC의 목표입니다. Heap은 동일한 크기의 영역으로 나뉘어 집합으로 분할되어 연속된 가상 메모리로 존재하게 됩니다. G1 GC는 Heap Area를 일정 크기의 region으로 구분하여 논리적으로 구분하고 있습니다. 최초 객체가 생성되면 Eden에 할당하고 Survivor로의 이동과 소멸 그리고 Old Region으로의 이동 생명주기를 가집니다. G1 GC의 수행 과정 Initial Mark Old Region에 존재하는 객체들이 참조하는 Survivor Region을 찾습니다. Root Region Scan Initial Mark에서 발견..

ZGC

ZGC란 ZGC는 아래의 목표를 충족하기 위해 설계된 확장 가능하고 낮은 지연율을 가진 GC입니다. 정지 시간이 최대 10ms를 초과하지 않음 Heap의 크기가 증가하더라도 정지 시간이 증가하지 않음 8MB ~ 16TB에 이르는 다양한 범위의 Heap 처리 가능 JVM으로 구동되는 애플리케이션의 경우, GC가 동작할 때 pause로 인해 성능에 큰 영향을 미쳐왔습니다. ZGC는 Load barrier와 Colored Pointer를 함께 사용해 puase 시간을 줄여 성능이 향상되었습니다. Colored Pointer 객체를 가리키는 변수의 포인터에서 64bit를 활용해서 marking을 하고 있습니다. Finalizable: finalizer를 통해서만 참조되는 Object의 Garbage Remapp..

Shenandoah GC

Shenandoah GC의 개념 Shenandoah GC는 '큰 GC 작업을 적은 횟수로 수행하는 것보다 작은 GC 작업을 여러분 수행하는게 더 좋다'는 개념을 적용해 만들어진 GC 입니다. Shenandoah GC는 작은 단위의 GC 수행을 자주 수행하기 위해 Concurrency를 보장합니다. 즉 말하자면, GC가 CPU를 더 사용하는 대신 pause 시간을 줄이겠다는 의미입니다. Shenandoah GC의 특징 Shenandoah GC는 기존 CMS가 가진 단편화, G1이 가진 pause의 이슈를 해결했습니다. 강력한 Concurrency와 가벼운 GC 로직으로 heap 사이즈에 영향을 받지 않고 일정한 pause 시간이 소요됩니다. Single-Generational Shenando..

JIT Compiler

JIT Compiler의 개념 JIT Compiler는 바이트 코트들 CPU로 직접 보낼 수 있는 명령어로 바꾸는 프로그램입니다. 일반적으로 컴파일러는 개발자와 최종 사용자를 위한 애플리케이션의 속도를 결정하는데 있어 핵심입니다. JIT Compiler는 성능 최적화를 위해 애플리케이션 런타임을 향상시킬 수 있습니다. JIT Compiler를 사용하는 이유 JIT Compiler는 같은 코드를 매번 해석하지 않고 실행할 때, 컴파일을 하면서 해당 코드를 캐싱합니다. 이후에는 변경된 부분만 컴파일하고 나머지는 캐싱된 코드를 사용하기 때문에 실행 능력이 크게 향상됩니다. 또한, JIT Compiler는 바이트 코드를 컴파일하는 과정에서 스택 연산을 레지스터 연산으로 변환하거나 레지스터 할당을 통한 메모리 접..

Java/일반 2021.10.08

Java 15

새로운 기능 Sealed Classes Java의 Class 계층 구조는 상속을 통해 코드 재사용을 가능하게 합니다. 많은 Class들은 상속되고 재사용되고 있습니다. 하지만 그래픽 라이브러리에서 Shape의 종류와 같이 도메인에 존재하는 다양한 가능성을 모델링 하는 것이 목적인 경우에는 subClass 집합을 제한했을 때, 모델링이 더 간소화 될 수 있습니다. Sealed Class의 목표는 개별 클래스를 선언할 때, 상속 받을 수 있는 종류의 클래스도 함께 선언하도록 하는 것입니다. 이를 통해 class의 무분별한 상속을 통한 확장이 발생하지 않도록 하는게 가장 중요한 목표입니다. public abstract sealed class Person permits Employee, Manager { } 예..

Java 14

미리 보여주는 기능 Records Record는 POJO 데이터 모델에서 반복적인 코드를 줄이기 위해 도입되었습니다. 기존의 POJO 데이터 모델의 클래스에는 생성자, Getter, Setter, equals, toString 등을 직접 작성해야 했습니다. 그러나 Record의 경우에는 아래와 같이 선언하면 자동적으로 앞의 요소들이 생성됩니다. public record User(int id, String password) { }; 새로운 기능 NullPointerException의 개편 기존의 NullPointerException은 발생한 이유에 대해 많은 정보를 담고 있지 않았습니다. 명확하게 어떤 문제인지 직접 유추했어야 하는데 이 부분이 조금 더 강화되었습니다. 이전 버전 Exception in t..

Java 13

미리 보는 변화 Switch문 개편 @Test @SuppressWarnings("preview") public void whenSwitchingOnOperationSquareMe_thenWillReturnSquare() { var me = 4; var operation = "squareMe"; var result = switch (operation) { case "doubleMe" -> { yield me * 2; } case "squareMe" -> { yield me * me; } default -> me; }; assertEquals(16, result); } Text Block 기존에는 여러 줄에 걸쳐진 문자열을 표현할 때는 \r, \n과 같은 형태로 구현해야 했습니다. 그러나 text block..

Java Heap 메모리 구조

Java 8 이전까지의 Heap 메모리 구조 Young Young 영역은 Eden 영역과 Survivor 영역으로 구성됩니다. Eden 영역은 객체가 Heap에 최초로 할당되는 장소입니다. 만약 Eden 영역이 꽉 차게 되면 객체의 사용중 여부를 따져 만약 사용 중인 객체이면 Survivor 영역으로 넘기고, 사용 되지 않는 객체이면 그냥 남겨 둡니다. 사용 중인 모든 객체가 Survivor 영역으로 넘어가면 Eden 영역을 정리합니다. Survivor 영역은 Eden에서 살아남은 객체들이 잠시 머무르는 공간입니다. Survivor 영역은 두 개로 구성되는데 참조 중인 객체를 이동할 때는 하나의 Survivor 영역만 사용하게 됩니다. Old Young 영역에서 정리되지 않고 계속 사용중인 객체들은 Ol..

Java/일반 2021.08.23
반응형