Daily Dev Q&A

JVM

awake123 2026. 1. 18. 23:34




자바 가상 머신
컴파일된 .class 파일(바이트코드)을 os관계 없이 실행시켜주는 도구

실무에서의 중요도
사용하지 못한다면 : 

자바 바이트 코드 실행 불가. -> 모든 자바기반 서비스 동작 불가.
플랫폼 독립성 상실 -> 윈도우, 리눅스 , 맥에 맞게 매번 빌드해야함.
가비지 컬렉션 기반 메모리 관리 기능 소실 -> 메모리 누수 위험 증가
자바 생태계 라이브러리, 프레임워크 사용 불가 -> 스프링기반 웹 서비스 구동 불가 / 마이크로서비스 기반 구조 대부분 장애.
개발 운영 생산성 급락 -> JIT 최적화 , 여러 성능의 튜닝 옵션, 풍부한 모니터링도구(JMX,Flight Recorder)등 사라짐.

금융권 백엔드 시스템, 공공기관 전산시스템, 대규모 웹서비스 등도 자바 기반이기에 사용불가.

최적화/효율성 제공
최적화 :

JIT 컴파일 -> jvm은 처음에는 바이트 코드를 인터프리터로 실행시키지만 자주 실행되는 코드를 감지하면 네이티브 코드로 컴파일하여 속도를 향상시킨다.
hotspot기반 실행 최적화 -> 코드 실행 패턴을 관찰하여 가장 많이 사용되는 부분(hot spot)을 자동 최적화. / 개발자가 성능 튜닝을 하지 않아도 지속적으로 개선.
가비지 컬렉션 기반 메모리 최적화 -> 필요없는 객체를 제거하여 메모리 누수방지, 서버 안정성 향상, 등의 효과를 제공.
멀티스레드 최적화 -> 스레드 스케쥴링,  락 최적화, 병렬 가비지 컬렉션 으로 멀티코어 자원 최대 활용.

효율성 :
플랫폼 독립성 -> 바이트 코드는 어느 os에서나 자바 가상머신으로 동일하게 실행. / 운영 비용 절감
메모리 영역 최적화 구조 -> Heap 객체 저장 / Stack 메서드 호출, 지역변수 / Method Area 클래스 정보 / Native Method Stack JNI 호출
라이브러리/프레임워크 생태계 활용 -> 자바, 코틀린, 스칼라, 그루비등 언어모두 동작가능 / Spring , Hibernate , Spark, Netty등 강력한 프레임워크



자바 가상머신의 주요 역할 : 
바이트 코드를 로드하고 실행.

런타임 환경 제공. -> 네트워크 처리, 파일 시스템 접근, 스레드 관리,  / 앱이 운영체제의 의존성을 최소화하고 동일하게 동작하도록 도움.

보안 역할 -> 악의적 코드 실행 방지/ 불법 메모리 접근 차단 / 시스템 자원 오남용 방지

성능관리 및 모니터링 -> JMX / JFR / VisualVM / GC로그 분석 제공

면접에서 질문한 의도 : 

자바의 기초 기술 이해도
자바 개발의 기초이기에 언어와 플랫폼의 근본원리를 제대로 이해하고 있는지 확인.

시스템 구조적 사고 능력 -> 실행 구조 전체와 연결되어 있으니 jvm을 설명하는 과정에서 지원자가 시스템을 전체적으로 바라보는 능력을 평가가능,

실무경험 기반 설명 능력 -> GC튜닝 경험 / JVM 옵션 사용 경험 /장애 대응에서 JVM 로그 분석 경험/ 메모리 누수 해결 사례

자바 언어에 대한 이해도. -> 왜 자바가 플랫폼 독립적인지. / 왜 JVM 환경에서 메모리 누수가 발생할수 있는지/ 왜 GC가 필요한지.

메모리 누수가 발생하는 이유 
1.객체가 아직 참조되기 때문.
-> 컬렉션(List, Map)에 객체를 넣고 제거하지 않음 
-> 사용이 끝난 객체를 정적(static) 변수로 계속 참조
-> 오래 남아있는 캐시에 객체를 계속 쌓아둠
2. Listener, Callback 등록후 제거하지 않은 경우

3.ThreadLocal 오용
-> ThreadLocal 사용후 remove()하지 않은 경우
-> 스레드 풀에서 재사용되는 스레드에 ThreadLocal 값이 그대로 남는 경우

4. 닫지 않는 외부 자원(파일 ,소켓)

5. classLoader 누수
-> 정적 필드에 큰 객체를 보관
-> 스레드가 종료되지 않아 클래스 로더를 붙잡고있는 경우



인터프리터와 네이티브 코드의 차이점 
1. 인터프리터
-> 바이트 코드를 한줄씩 읽고 바로 실행.
-> 실행속도는 다소 느림.
-> 초기 시작 시간이 빠름 
-> 즉시 실행이 필요하거나 코드가 자주 실행되지 않는 경우 유리.

2. 네이티브 코드
-> JVM이 코드 실행 패턴을 분석하여 자주 실행되는 코드를 최적화된 기계어로 컴파일 후 캐싱
-> 이후 인터프리팅 없이 네이티브 코드로만 실행. / 매우 빠른 속도
-> 장기 실행 서버에서 큰 이점

JVM 메모리 영역 구조가 왜 최적화 구조인가.
1. 스택과 힙의 분리
-> 스택 : 메서드 실행 정보, 지역 변수가 짧은 생명 주기로 빠르게 생성.삭제
-> LIFO구조라 매우 빠르게 관리가능.
-> 힙: 객체가 오래 살아남고 구조가 복잡함.
-> GC가 필요.

=> 생존 주기가 다른 데이터를 분리하여 최적의 관리 방식.

2. Young / old Generation
-> young : 짧게 살아가는 객체 / 빠른 Minor GC
-> old : 오래 살아남는 객체 / 상대적으로 느린 Major GC 주기적 실행

3. Metaspace / Method  Area 분리
Metaspace는 JVM의 Method Area를 대체하는 영역이며, 클래스 메타데이터를 저장한다.
(Java 8 이전: PermGen, 이후: Metaspace)

JVM에서 보안 역할은 어떻게 동작하는가.
1. 바이트 코드 검증
-> 클래스 로딩시 바이트 코드를 검증하며
-> 불법 메모리 접근
-> 스택 오버플로
-> 유효하지 않은 점프 등을 차단.

2. Class loader 보안
-> 상위 로더가 로드한 클래스는 하위로더가 재정의 불가
-> 악성코드가 중요 클래스 바꿔치기 방지.

3. Security Manager
-> 권한기반 제어로 파일 접근, 네트워크 접근을 제한 하는 역할.
Java 17부터 deprecated

4. Sandbox 실행
-> 서명되지 않은 코드나 외부코드(Applet 시절)는 Sandbox에서 격리.


'Daily Dev Q&A' 카테고리의 다른 글

데이터 베이스의 락  (0) 2026.02.01
http와 https의 차이  (0) 2026.01.25
application context  (0) 2026.01.16
WAS와 웹서버  (0) 2026.01.11
Garbage Collection  (0) 2026.01.07