
1. JIT 컴파일러(Just-In Time Compiler)의 최적화 과정 자세히 살펴보기 [ Inlining(인라인) ] 앞선 포스팅에서 살펴보았듯 Inlining은 호출되는 메서드를 본문으로 인라인하여 메서드 호출에 대한 오버헤드를 줄일 수 있고, 이를 통해 다른 최적화를 적용할 수도 있다. 하지만 인라인은 코드 크기를 늘리기 때문에 신중하게 적용되어야 한다. 왜냐하면 컴파일된 코드는 제한된 코드 캐시라는 힙 공간에 저장되는데, 공간이 부족해지면 더 이상 코드를 컴파일 할 수 없기 때문이다. 따라서 JVM은 휴리스틱하게 메서드의 인라인 여부를 결정하는데, 대표적으로 자주 호출되는 메서드나 Getter와 Setter 같은 간소한 메서드들을 인라인하려고 시도한다. 인라인 정책은 JVM 매개변수로 변경할..

1. JIT 컴파일러(Just-In Time Compiler)란? [ JIT 컴파일러(Just-In Time Compiler)란? ] 자바 컴파일러(javac)는 자바 파일을 읽고 클래스 파일로 컴파일한다. 바이트코드는 모든 연산 코드가 단일 바이트로 표시되며 플랫폼에 종속되지 않는(portable) 명령어 집합으로 구성된다. 이들은 자바 가상 머신(JVM)에서 실행되며 실행 시점에 기계어로 번역한다. 덕분에 특정 아키텍처에 종속적되지 않지만 성능은 훨씬 떨어진다. JVM 초기에는 실행 시점에 모든 바이트코드를 직접 기계어로 해석했기 때문에 성능 문제가 있었다. 이를 위해 JDK 1.3에 HotSpot VM이 도입되어 런타임에 바이트코드를 느리게 해석하는 대신 최적화된 코드를 실행할 수 있는 JIT(Ju..

1. 예시로 살펴보는 IntelliJ 프로파일링 결과 분석 및 성능 최적화 방법[ 샘플 코드 작성 및 프로파일링하기 ]IntelliJ Ultimate를 사용하고 있다면, 손쉽게 프로파일링을 진행하고 결과를 확인할 수 있다.예를 들어 다음과 같은 컨트롤러와 서비스가 있다고 하자.@RestController@RequiredArgsConstructorclass BoxingController { private final BoxingService boxingService; @GetMapping("/boxing") int boxing() { int result1 = boxingService.max1(100000000L); int result2 = boxingService.m..

1. Async-Profiler 소개 및 사용 방법[ Async-Profiler란? ]async-profiler는 오픈소스 프로젝트로, Safepoint bias 문제를 겪지 않는 자바 전용 저오버헤드(low-overhead) 샘플링 프로파일러이다. Safepoint란 GC 작업을 진행하면서 사용되지 않는 객체들을 식별하는데, 이때 애플리케이션이 안전한 지점으로 이동하여 GC를 진행할 수 있는 지점을 safepoint라고 한다. 그리고 Safepoint bias 문제란 간단히 요약하면 샘플링 프로파일러에 의한 분석 샘플이 특정 위치로 편향되는 문제를 의미한다. 기존의 많은 자바 샘플링 프로파일러들은 Safepoint bias 문제에 의해 정확한 분석을 해주지 못했기 때문에 상당히 아쉬운 부분이 많이 있었..

1. 코틀린에서 move instance method 리팩토링 기능 활성화하기 [ move instance method 리팩토링 기능 소개 ] 예를 들어 신용카드를 발급하는 유스케이스가 있고, 신용카드 발급을 위해서는 기본적으로 사용자가 20세 이상의 성인이여야 한다고 하자. 해당 코드는 자바로 다음과 같이 구현할 수 있다. @Getter @Builder @NoArgsConstructor @AllArgsConstructor public class User { private int age; } @Service @RequiredArgsConstructor class IssueCreditCardUseCase { public void issue(User user) { if (isAdult(user)) { .....