Sign In

개발일지

모니터락
모니터락에 대한 설명 정의 모니터락은 Java에서 각 객체와 연관된 내장 락(intrinsic lock)으로, 여러 스레드가 공유 자원에 안전하게 접근할 수 있도록 동기화를 제공합니다. 이는 특히 synchronized 블록이나 메서드에서 사용됩니다. 작동 방식 스레드가 synchronized 블록이나 메서드에 진입하면, 해당 객체의 모니터락을 획득합니다. 이 락을 획득한 동안 다른 스레드는 동일한 락을 획득할 수 없으므로, 동기화된 코드가 한 번에 하나의 스레드만 실행됩니다. 락은 블록이나 메서드 종료 시(정상 종료 또는 예외 발생 시) 자동으로 해제됩니다. 구현 세부 사항 모니터락은 내부적으로 운영체제의 동기화 원시(예: 뮤텍스, 세마포어)를 사용하여 구현됩니다. 예를 들어, 스레드가 락을 기다릴 때, JVM은 운영체제의 대기 큐를 사용하여 스레드를 관리합니다. 그러나 이러한 세부 사항은 Java 프로그래머에게는 숨겨져 있으며, synchronized 키워드나 명시적 락(예: ReentrantLock)을 통해 쉽게 사용할 수 있습니다. Java의 synchronized 키워드를 사용한 Counter 클래스의 동작을 스레드 락과 메모리 관점에서 단계별로 설명하겠습니다. 주어진 코드를 기반으로, 두 스레드가 increment()와 getCount() 메서드를 호출할 때 스택과 메모리(특히 힙과 네이티브 메모리)가 어떻게 작동하는지, 그리고 모니터락이 어떻게 관리되는지 상세히 분석하겠습니다. 코드 가정 및 시나리오 두 스레드, T1과 T2가 있다고 가정합니다. T1은 increment()를 호출하고, T2는 getCount()를 호출합니다. Counter 객체는 단일 인스턴스(counter)로, JVM 힙에 할당됩니다. synchronized 메서드는 Counter 객체의 모니터락(intrinsic lock)을 사용합니다. 아래에서 각 단계를 스택, 힙 메모리, 네이티브 메모리(커널 메모리) 관점에서 설명하고, 스레드와 락의 상태를 추적하겠습니다. 단계별 분석 초기 상태 JVM 힙 메모리: Counter 객체(counter)가 힙에 생성됩니다. 객체의 메모리 구조: count: int 필드, 초기값 0. 모니터락: 모든 Java 객체는 모니터락을 가집니다. 이는 객체의 헤더에 잠금 상태(예: 락 소유자, 락 카운트)를 저장하며, 초기 상태는 "unlocked"입니다.
  • 따라라란라란
가비지컬렉터
다음은 제공된 텍스트를 불릿포인트로 정리한 내용입니다: 가비지 컬렉터의 중요성: 자동 동적 메모리 관리 시스템으로, Java와 같은 관리형 언어의 인기 요인. 개발자 생산성 향상: 새로운 객체를 위한 메모리 할당. 더 이상 필요 없는 객체의 메모리 해제. 메모리 단편화 정리. 객체 중복 제거 등의 작업 수행. 메모리 관리 문제를 제거하여 Java 개발자가 비즈니스 로직에 집중 가능. 성능 구성에서의 역할: 최대 힙 크기 설정이 가장 중요한 결정. 고성능 애플리케이션(분당 수천~수백만 요청, 기가바이트 메모리)에서는 가비지 컬렉터 선택 및 구성 중요. 가비지 컬렉터 작동 원리 이해가 올바른 구성의 핵심. G1 가비지 컬렉터: JDK 11 이상에서 Java의 기본 가비지 컬렉터. 관련 정보는 dev.java에서 확인 가능. G1의 역사: 1999년에 기원, 2004년 ISMM 컨퍼런스에서 백서 발표. 다중 프로세서와 대용량 메모리 환경을 목표로 한 서버 스타일 가비지 컬렉터. 설계 배경:
  • 따라라란라란
프로세스와 쓰레드
Os는 프로세스 단위로 가상메모리공간을 제공하며 한프로세스는 최소 1개의 쓰레드를 가지고 있음 쓰레드는 프로세스의 가상메모리 공간을 사용 Os는 Process단위로 각종 접근권한을 통제 보통 접근은 file에 대한 접근을 의미 JVM은 사용자모드 응용 프로그램 (Process) 프로세스 = 집 쓰레드 = 사람 만약 여러사람이라면 예의가 중요. = 동기화.
  • 따라라란라란
JVM 힙
JVM 메모리 구조에서 힙(Heap)과 스택(Stack)의 차이점은 무엇이며, 각각의 영역에서 어떤 데이터가 저장되는지 설명하세요. 스택은 정적할당, 힙은 동적 할당 객체와 배열이 런타임에 생성되며, 필요에 따라 크기가 유연하게 조정됩니다. 메서드 호출 시 프레임(Frame)이 고정된 크기로 스택에 쌓이고, 메서드 종료 시 자동으로 제거됩니다. 데이터 저장 기간 힙: 객체는 명시적으로 가비지 컬렉션(Garbage Collection)에 의해 제거될 때까지 메모리에 유지됩니다. 스택: 메서드 호출이 끝나면 해당 프레임이 즉시 pop되어 메모리가 해제됩니다. 즉, 스코프 기반으로 짧은 생명주기를 가집니다. 스택은 프레임단위로 지역변수, 파라메터, 참조변수, 메서드 호출 스택등이 저장됨. 힙에는 객체 인스턴스와 배열이 저장됨. 스택은 쓰레드 별로 독립적이고 힙은 공유함. • 힙 메모리에서 발생할 수 있는 메모리 누수를 디버깅하는 방법에 대해 설명하세요. 가비지 콜렉션 상황을 모니터링 힙덤프 힙 덤프는 특정 시점의 메모리 상태를 스냅샷으로 저장해 어떤 객체가 메모리를 점유하고 있는지 분석할 수 있게 합니다. • 스택 오버플로우(Stack Overflow)가 발생하는 이유와 이를 방지하기 위한 전략을 논의하세요. 무한 재귀 또는 깊은 재귀 호출 과도한 메서드 호출 깊이 스레드 관리 • JVM 메모리 구조에서 메타스페이스(Metaspace)의 역할과 힙 메모리와의 차이점을 설명하세요. 메타스페이스 = 클래스와 관련된 정보 힙메모리 = 인스턴스에 관한 정보. 실제 예시 public class Person { private String name; public String getName() { return name; } } 메타데이터 내용:
  • 따라라란라란
Made with Slashpage