Java
-
JVM 밑바닥까지 파헤치기 - 프런트엔드 컴파일과 최적화Java 2024. 12. 22. 14:24
개요스터디를 진행하면서 JVM 밑바닥까지 파헤치기 책의 10장 프런트엔드 컴파일과 최적화 발표를 맡게 되었고 이에 대한 내용을 정리해보고자 합니다. 프런트엔드 컴파일이란?.java 파일을 .class 파일로 변환하는 과정을 프런트엔드 컴파일이라고 합니다. 자바 소스 코드 → 바이트코드로 변환하는 과정입니다. 반대로 백엔드 컴파일의 경우 바이트코드를 기계어로 변환하는 과정을 뜻합니다. JIT 컴파일러가 런타임에 최적화를 수행하기도 하며, AOT 컴파일러가 특정 하드웨어용 네이티브 바이너리 코드로 곧바로 컴파일하기도 합니다. 최적화(optimization)는 무엇을 의미할까?먼저 최적화의 사전적 의미를 찾아보면 아래와 같습니다. 1. 한정된 자원과 상황 속에서 최대한의 성능을 발휘할 수 있도록 끌어올리는 ..
-
Future를 활용하여 Timeout 구현하기Java/Executor Service 2024. 4. 7. 22:21
개요 코루틴 Timeout이 제대로 동작하지 않은 이유라는 글을 작성하며 코루틴을 활용하여 Timeout을 구현해 보았습니다. 동기적인 코드가 섞여있는 상황이라면 코루틴에 협조적이지 않아 타임아웃이 잘 동작하지 않았던 이슈가 있었고 새로운 스레드를 할당하여 문제를 해결했지만 타임아웃이 발생하더라도 비동기적으로 실행되는 코드들이 계속 동작하는 문제가 있었습니다. 이 문제를 해결하기 위해서 Java 1.5부터 Future를 활용해 볼 수 있습니다. Future란? Future submit(Callable task); Future submit(Runnable task); ExecutorService에서 Runnable, Callable Task에 대해 submit 메서드를 활용하면 Future에 대한 반환값을..
-
ScheduledThreadPoolExecutor란?Java/Executor Service 2024. 3. 17. 19:29
개요 ScheduledThreadPoolExecutor라는 개념을 알게 되어 이해해보고자 합니다. 해당 글을 읽기 전 Future, ThreadPool, ExecutorService, ThreadPoolExecutor 개념에 대해 잘 모른다면 다음 글을 읽고 오시면 좋습니다. ExecutorService란? ThreadPoolExecutor란? ScheduledThreadPoolExecutor란? val fixedThreadPool = Executors.newFixedThreadPool(2) val scheduledThreadPool: ExecutorService = Executors.newScheduledThreadPool(2) //newScheduledThreadPool 내부 구현은 Scheduled..
-
BigDecimal이란?Java 2024. 1. 10. 00:01
개요 숫자를 다루는 클래스인 BigDecimal에 대해 들어는 보았지만 사용해 본 적이 없어 이번기회에 사용해 보며 개념을 잡아보고자 합니다. BigDecimal이란? java.math 패키지의 속한 Java 클래스로 정밀한 숫자 연산에 사용됩니다. 정밀도가 중요한 금융 및 과학 계산에 적합합니다. double 및 float와 같은 데이터 유형의 오차를 해결합니다. BigDecimal이 등장한 이유 (float와 double의 문제점) val b: Double = 0.1 val c: Double = 0.2 println(b+c) 0.1 + 0.2의 결과는 무엇일까요? 우리는 0.3을 기대할 수 있습니다. 하지만 실제 결과는? 0.30000000000000004 float와 double은 정확한 값이 아닌..
-
ThreadPoolTaskExecutor란? (ThreadPoolTaskExecutor vs ThreadPoolExecutor)Java/Executor Service 2023. 10. 21. 00:01
ThreadPoolTaskExecutor란? public class ThreadPoolTaskExecutor extends ExecutorConfigurationSupport implements AsyncListenableTaskExecutor, SchedulingTaskExecutor { private final Object poolSizeMonitor = new Object(); private int corePoolSize = 1; private int maxPoolSize = Integer.MAX_VALUE; private int keepAliveSeconds = 60; private int queueCapacity = Integer.MAX_VALUE; private boolean allowCore..
-
ThreadPoolExecutor란?Java/Executor Service 2023. 10. 20. 00:01
ThreadPoolExecutor란? public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue()); } Executors의 클래스의 메서드에서 고정된 스레드풀의 개수를 반환하는 newFixedThreadPool에서는 내부적으로 ThreadPoolExecutor를 생성하여 반환합니다. newFixedThreadPool을 호출할 때는 스레드의 개수만 지정해 주면 되지만 내부적으로는 기본적인 값들이 세팅돼서 제공됩니다. // Executors를 사용해서 간편하게 스레드풀 ..
-
ExecutorService란?Java/Executor Service 2023. 10. 19. 00:01
Executor란? public interface Executor { void execute(Runnable command); } ExecutorService가 Executor 인터페이스를 구현하고 있습니다. Executor 인터페이스는 Runnable 객체를 미래의 어느 시점에 주어진 명령으로 실행합니다. Runnable이란? @FunctionalInterface public interface Runnable { public abstract void run(); } Runnable 인터페이스는 인스턴스가 스레드에 의해 실행되는 의도된 모든 클래스에서 구현합니다. 예를 들어 Runnable 인터페이스는 Thread 클래스가 구현하고 있습니다. 스레드를 시작하면 별도의 실행 중인 스레드에서 객체의 run ..
-
구독의 보너스 날짜 계산하기Java 2023. 9. 19. 00:01
개요 구독의 주기는 1달로 일어난다고 가정해 보겠습니다. 이때 만약 어떤 일로 인해서 미리 구독을 해지시키고 다시 1달짜리를 가입시켜 주어야 한다면 어떻게 될까요? 예를 들어 10월 15일에 어떤 사용자가 구독을 시작했는데 10월 21일에 구독 해지가 일어나고 다시 가입이 진행된다면 이 유저는 보너스 6일을 얻어야 합니다. 테스트 class BonusPeriodTest { @Test @DisplayName("현재 날짜가 10월15일이고, 구독일이 10월 1일이라면 해당 구독은 11월 1일에 만기되야하므로 보너스날짜는 17일이다") void test1(){ LocalDate currentDate = LocalDate.of(2023,10,15); LocalDate subscribedAt = LocalDate..