(참고 사이트)

바이트 코드, 기계어, 바이너리 코드, 네이티브 코드
- https://velog.io/@sia/%EB%B0%94%EC%9D%B4%ED%8A%B8-%EC%BD%94%EB%93%9C-%EA%B8%B0%EA%B3%84%EC%96%B4-%EB%B0%94%EC%9D%B4%EB%84%88%EB%A6%AC-%EC%BD%94%EB%93%9C-%EB%84%A4%EC%9D%B4%ED%8B%B0%EB%B8%8C-%EC%BD%94%EB%93%9C
- https://usefultoknow.tistory.com/entry/%EB%B0%94%EC%9D%B4%EB%84%88%EB%A6%AC%EC%99%80-%EB%B0%94%EC%9D%B4%ED%8A%B8-%EC%BD%94%EB%93%9C%EB%9E%80-%EA%B8%B0%EA%B3%84%EC%96%B4%EB%9E%80

jit 컴파일러
- https://m.blog.naver.com/ki630808/221844888233
- https://kotlinworld.com/307

jvm 동작원리
- https://steady-snail.tistory.com/67

 

java 탄생배경
  - 같은 기능의 소스를 각 하드웨어 마다 다르게 작성해야하는 불편함 때문에 java를 개발하게됌

java 특징
  - jvm이 코드를 각 운영체제(OS)에 맞게 변환 시켜주기 때문에 운영체제로 부터 독립적이다.(기존 프로그래밍 언어 C/C++은 운영체제에 종속적)

- 바이너리 코드(binary code)
  - 이진 코드라고도 불림
  - 0과 1의 연속으로 이러우진 코드

- 기계어
  - 0과 1로 이루어진 바이너리 코드
  - 하지만 같은 동작을 하는 명령어일지라도 완전히 다른 0과 1의 나열이 될수있기 때문에 기계어는 바이너리 코드라고 할 수 없다(바이너리 코드 != 기계어)
  - 즉 CPU마다 기계어는 모두 다르다.

- 네이티브 코드
  - CPU와 운영체제(OS)에서 직접 실행할 수 있는 코드
    - 즉 "현재 프로그램이 돌아가는 환경에 적합한 기계 언어"
  
자바 바이트 코드(java bytecode)
  - 자바 가상 머신(jvm)이 이해할 수 있는 언어로 변환된 자바 소스 코드를 의미한다.
  - 명령어 코드가 1바이트라서 자바 바이트 코드라고 불린다.
  - CPU가 아닌 자바 가상 머신(jvm)에서 이해할 수 있는 0과 1로 구성된 이진 코드
  - 자바 가상 머신(jvm)이 설치되어 있으면 어떤 운영체제라도 실행 가능하다.

자바 컴파일러(java compiler)
  - 작성한 자바 소스를 가상 머신(jvm)이 이해할 수 있도록 자바 바이트 코드로 번역한다.
  - 자바 바이트 코드의 확장자는 -> *.class
  
인터프리터(interpreter)
  - 자바 바이트 코드를 한 줄씩 특정 환경의 기계어(네이티브 코드)로 번역하여 실행한다.
  
jit 컴파일러(just-in-time compiler)
  - 인터프리터의 단점을 보완하기 위해 도입된 방식
  - 처음에 코드를 인터프리터 방식으로 실행하다가 자주 쓰이는 코드를 기계어(네이티브 코드)로 캐싱하여 보관한다.
  
jvm
  - 자바 가상머신(Java Virtual Machine)의 약자
  - 자바를 돌리는 프로그램
  - 자바 실행 환경 JRE(Java Runtime Environment)에 포함
  - JVM을 사용함으로써 자바 프로그램을 모든 플랫폼에서 제약없이 동작하도록 할 수 있다.
  - 컴파일된 코드(바이트 코드)와 하드웨어/OS사이 중간에서 해당 하드웨어/OS 환경에 맞게 바이트 코드를 변환해주기 때문에 자바 프로그램을 모든 플랫폼에서 제약 없이 동작하도록 도와준다.
  - 단 자바 프로그램은 운영체제에 독립적이지만 자바 가상 머신(JVM)은 운영체제에 종속적이다.
    - 그렇기 때문에 각 운영체제에 맞게 자바 가상 머신을 설치해야 한다.
  - 자바 프로그램은 다른 프로그램과 다르게 자바 가상 머신이라는 한 단계를 더 거쳐야 하므로 상대적으로 실행 속도가 느리다.
 
자바 가상 머신(JVM) 동작 방식
  - 자바 소스(*.java)를 작성한다.
  - 작성한 자바 소스를 자바 컴파일러(javac)를 통해 자바 바이트 코드로 컴파일한다.
  - 컴파일된 바이트코드를 jvm 클래스로더에 전달한다.
  - 클래스로더는 동적로딩을 통해 클래스들을 로딩 및 링크하여 런타임 데이터 영역 즉 jvm의 메모리에 올린다.
  - jvm메모리에 올라온 바이트 코드들을 실행엔진(execution engine)이 명령어 단위 하나씩 가져와서 실행한다.
 

jvm 클래스 로더
  - 계층구조
  - 위임모델
  - 가시성 제한
  - 언로드 불가
  - 이름공간
  - 컴파일 된 자바의 클래스 파일을 동적으로 로드
  - JVM의 
  
  
--------------------------------------------------------------------------------------------------------
- GC 모니터링이 필요한 경우 -
- 참고 사이트
  - https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EA%B0%80%EB%B9%84%EC%A7%80-%EC%BB%AC%EB%A0%89%EC%85%98-GC-%ED%8A%9C%EB%8B%9D-%EB%A7%9B%EB%B3%B4%EA%B8%B0
GC 모니터링 방법
# jstat gcutil  명령어로 현재 실행중인 8884번 프로세스에 대해 1초에 한번 씩 총 10번 GC와 관련된 정보를 출력하도록 모니터링
jstat -gcutil -t 8844 1000 10


가비지 컬렉션(Garbage Collector)
  - jvm에서 heap 메모리 영역에서 사용하지 않는 메모리를 자동으로 회수할때 가비지 컬렉션을 이용한다.
  - 자바에서는 개발자가 따로 메모리 관리를 하지 않아도 가비지 컬렉션을 이용해 자동으로 메모리를 실시간으로 최적화 시켜준다.
    - (C언어 경우 직접 개발자가 메모리를 해줘야한다.)

가비지 컬렉션 단점
  - GC가 발생할 경우 GC를 제외한 모든 스레드가 중지된다.
    - STW(Stop-The-World)용어로도 불린다.
  - 메모리가 언제 해제되는지 정확하게 알 수 없어 제어가 힘들다.
  
가비지 컬렉션 대상
Reachable : 객체가 참조되고 있는 상태
Unreachable : 객체가 참조되고 있지 않는 상태
  - JVM 메모리에서 Heap영역에서 생성된 객체가 Method Area나 Stack Area에서 참조하지 않을때 주기적으로 가비지 컬렉션이 제거 해준다.
  
Heap 영역
1. Young 영역
  - 새롭게 생성된 객체가 할당되는 영역
  - Young 영역에 가비지 컬렉션은 Minor GC라고 불린다.
2. Old 영역
  - Young 영역에서 생성된 객체 중에 Reachable상태를 지속적으로 유지하여 복사되는 영역
  - Young 영역 보다 메모리가 크게 할당된다.
  - Old 영역에 가비지 컬렉션은 Major GC 또는 Full GC라고 불린다.
  
1. Minor GC
  - Eden
    - 객체가 생성되면 Eden 영역에 생성된다.
- Eden 영역이 가득 차게 되면 Minor GC가 발생하고 살아남은 객체는 Survivor0, Survivor1영역으로 이동한다.
- 이때 살아남은 객체의 age 값은 1씩 증가한다. (0 -> 1)
  - Survivor0, Survivor1
    - Survivor0, Survivor1 둘중에 하나는 반드시 비어 있어야 한다.
- Eden 영역이 가득 차게 되면 Minor GC가 발생하고 살아남은 객체는 비어있는 Survivor 영역에 이동한다.
- 이때 살아남은 객체의 age 값은 1씩 증가한다. (n -> 1)
  - 반복적으로 Minor GC가 발생후에 age가 임계값에 도달하게 되면 해당 객체는 Old 영역에 이동된다.

2. Major GC, Full GC
  - Old 영역이 가득차게되면 실행된다.
  - Major GC가 발생하게 되면 참조되지 않는(Unreachable)객체 들은 한꺼번에 삭제된다.
  
--------------------------------------------------------------------------------------------------------  

+ Recent posts