본문 바로가기

Java17

메모리 가시성 멀티스레드에서 어떤 스레드에서 힙 메모리에 있는 값을 변경했다고 다른 스레드에서 바로 그 값이 보이는 것이 아니다.여러 코어가 있는 CPU의 경우 각 스레드가 캐시 메모리를 가지고 있다면 메인 스레드 변경이전에 캐시메모리에 변경한다.만약 다른 스레드에서 힙 메모리의 값에 대해 while문을 돌고 있었다면 그 스레드는 자신의 캐시 메모리를 확인하기 때문에 영원히 while문이 끝나지 않을 수 있다. 보통 컨텍스트 스위칭 할 때 캐시 메모리를 비우기 때문에 메인메모리에 쓰고 캐시메모리에 옮겨쓰는게 일어나지만 컨텍스트 스위칭에서 무조건 반영된다고 확신할 수 없다. 자바의 volatile는 캐시 메모리가 아닌 메인 메모리에 직접 쓰고 조회하라는 명령어이다.캐시 메모리를 사용하는 것보다 성능이 느려진다. 대략 5.. 2026. 2. 2.
스레드 로컬 각 스레드마다 별도 내부 저장소가 있다 빈은 싱글톤이라 애플리케이션전역에서 하나만 생성되는데 누가 필드에 철수라쓰고 다른 스레드가 영희라고 쓰면 값이 바뀜그래서 스레드마다 내부 저장소가 필요 스레드 로컬 모두 사용하고 나면 저장된 값을 꼭 제거해줘야 안하면 메모리 누수 가능함WAS의 스레드 풀을 사용하는 경우 기존 값이 남아있을 수도 있음 2026. 1. 23.
리플렉션 직접 함수를 호출하지않고 클래스와 메서드의 메타정보를 이용해서 함수를 호출할 수 있다.메서드 2개를 직접호출하지않고 Method.invoke() 하나만으로 각자 다른 메서드를 호출할때 넣어주기만 하면 생성할수있다하지만 동적으로 계산하기 때문에 컴파일오류를 잡지못하고 런타임오류만 뜨기 때문에 잘 사용되지 않는다예를들어 a라는 메소드가 있는데 실수로 Method.invoke("aa")를 해버리면 런타임에러가 발생한다. 메타정보는 컴파일시점에 결정되어있지만 조회하고 활용하는 행위는 런타임때 이루어짐컴파일러(javac)는 메타정보를 바이트코드에 이미기록함JVM 클래스 로딩때 클래스로더가 .class를 읽고 메타스페이스에 클래스 메타정보 적재 예외적으로 JDK동적프록시 CGLIB ByteBuddy는 런타임때 .. 2026. 1. 22.
자바의 컴파일, 클래스 로딩, 실행 구조 정리 1. 자바 실행 구조 개요일반적으로 프로그래밍 언어는 컴파일 → 링크 → 실행(런타임) 단계로 나뉜다.자바는 C/C++과 달리컴파일 시점과 실행 시점이 명확히 분리된 구조를 가진다.자바에서는.java 파일을 컴파일하면 .class 파일이 생성되고,이 .class 파일은 자바 바이트 코드로 이루어져 있다.2. 자바 컴파일 단계.java 파일은 javac에 의해 컴파일되어 .class 파일이 된다..class 파일의 내용은 자바 바이트 코드클래스 로더가 실제로 로딩하는 대상은 .class 파일이다바이트 코드는 사람이 직접 분석하기는 어렵다.일반적으로 16진수 형태의 숫자 나열이기 때문에 그대로 읽는 것은 힘들다.다만,javap -c 명령어로 디스어셈블 가능IntelliJ에서는 “바이트코드 보기” 메뉴 제공이.. 2026. 1. 3.
데몬 스레드 스레드는 크게 2가지로 나눌 수 있다. 1. 사용자 스레드2. 데몬 스레드 사용자 스레드는 우리가 보통 생각하는 스레드이고 비즈니스 로직을 처리하는 바로 그 스레드 이다. 프로그램의 주요 작업을 수행하며 작업이 완료될 때 까지 실행된다. 모든 사용자 스레드가 종료되면 JVM도 종료된다. 데몬 스레드는 백그라운드에서 보조적인 작업을 수행한다. 모든 사용자 스레드가 종료되면 데몬 스레드는 자동으로 종료된다. JVM은 데몬 스레드의 실행 완료를 기다리지 않고 종료된다. 데몬 스레드가 아닌 모든 스레드가 종료되면, 자바 프로그램도 종료된다. 자바 프로그램이 끝난다는 거는 사용자 스레드가 종료되는 시점이다. 스레드의 종료란 각 스레드의 스택이 모두 빠져나가고 하나도 남지 않는 시점이다. 2025. 8. 17.