1. 클래스 패스 섀도잉(Classpath Shadowing)이란?[ 클래스 패스란? ]JVM이 자바 애플리케이션을 실행하기 위해서는 .java 파일을 JVM이 이해할 수 있는 형태로 컴파일한 .class 파일이 필요하다. 그리고 클래스 파일은 .class와 같이 단건으로 저장될 수 있고, .jar와 같이 여러 클래스들이 압축 파일로 뭉쳐진 형태로도 존재할 수 있다.JVM은 .class과 .jar 파일 등을 탐색하여 메모리 위에 올리게 되는데, 이때의 탐색 경로를 클래스 패스(Classpath)라고 부른다. 즉, “우리가 만든 코드를 실행할 때 필요한 클래스들을 어디서 찾아야 하나?”를 JVM에게 알려주는 것이라고 볼 수 있다. 클래스 패스에는 보통 다음이 들어가며, 그 외에도 사용하는 도구에 따라 다양..
1. MySQL의 wait_timeout 설정과 HikariCP 6.1.0에 추가된 maxLifeTime 분산 기능[ MySQL의 wait_timeout 설정과 커넥션 풀의 maxLifeTime 설정이란? ]외부 리소스와의 연결을 위해, 반드시 추가해야 하는 설정 중 하나가 타임아웃이다. 타임아웃을 제대로 설정하지 않으면, 다른 컴포넌트의 응답이 느려질 때 애플리케이션 전체가 영향을 받을 수 있다. 대표적으로 MSA 환경에서 외부 API와 통신을 할 때 타임아웃 설정이 중요하다. 타임아웃 설정이 존재하지 않으면, 외부 API의 응답이 지연될 때 애플리케이션의 스레드가 대기 상태에 빠져 전체 서비스의 응답 속도가 느려지며 장애를 전파받을 수 있기 때문이다.데이터베이스 관점에서도 타임아웃 설정은 매우 중요하..
1. synchronized의 한계를 극복하기 위한 Lock 인터페이스와 ReentrantLock 클래스이전 포스팅에서 설명하였듯, synchronized 키워드를 활용한 동시성 제어는 다음의 2가지 치명적인 문제가 있었다.공정성 문제: 락의 획득 순서가 보장되지 않음무한 대기 문제: 대기하는 스레드를 깨우는 등의 제어를 할 수 없음 이런 문제를 해결하기 위해 자바 1.5부터 java.util.concurrent 라는 동시성 문제 해결을 위한 라이브러리 패키지가 추가되었다. [ 무한 대기 문제를 해결하기 위한 LockSupport 클래스 ]먼저 무한 대기 문제를 해결하기 위해 LockSupport 클래스가 추가되었다. LockSupport는 스레드를 블로킹/언블로킹하기 위한 가장 기본적인 도구로, ..
1. 동시성 제어를 위한 synchronized 키워드의 의미와 한계점[ synchronized 키워드란? ]자바 언어는 설계 초기부터 대량의 요청을 처리할 수 있도록 멀티 스레드를 염두하여 설계되었다. 이를 위해 자바는 1.0부터 손쉽게 동시성을 제어할 수 있는 synchronized 키워드를 제공하였다. synchronized 키워드를 사용하면 임계 영역의 동기화를 쉽게 구현할 수 있다. synchronized 키워드는 메서드 선언부에 붙여 사용하거나 특정 객체를 대상으로 동기화 블록을 만들어 사용할 수도 있다.public class BankAccount { private int balance = 0; // synchronized 메서드 public synchronized void d..
1. 힙 객체 헤더의 비효율과 이를 줄이기 위한 새로운 자바 객체 헤더(New Java Object Header: Compact Object Headers)[ 힙 객체 헤더의 비효율성 ]앞서 설명하였듯 자바에서 객체의 크기를 구하려면 기본적으로 객체의 헤더 크기에 변수의 크기(원시 타입인 경우) 또는 참조의 크기(참조 타입인 경우)를 더해주어야 한다. 그리고 만약 더해진 값이 8의 배수가 아니라면, 별도의 패딩 바이트를 더하여 객체의 크기가 항상 8의 배수가 되도록 보정하고 있다. Klass 포인터 압축 유무 혹은 최대 힙의 크기 등에 따라 실제 사용되는 바이트의 수가 달라질 수 있는데, 64비트 JVM을 기준으로 이를 정리하면 다음과 같다.상태마크 워드의 크기클래스 워드의 크기클래스 포인터 비압축(no..