# 학습해야 하는 목록
- JVM이란 무엇인가
- 컴파일 하는 방법
- 실행하는 방법
- 바이트코드란 무엇인가
- JIT 컴파일러란 무엇이며 어떻게 동작하는지
- JVM 구성 요소
- JDK와 JRE의 차이
- javac 옵션 조사
---------------------------------------------------------------------------------
1. JVM이란 무엇인가
- JVM 은 Java Virtual Machined의 약자이다. 자바의 모토가 Write Once, Run Anywhere 라는데, 이를 지원하기 위해 존재한다고 생각한다. 보통 일반적인 컴퓨터들은, 하드웨어 위에 운영체제가 있고 이 위에 프로그램들이 존재하는데, 자바 가상 머신이 추가됨으로써, 물론 OS 별로 VM 은 다르겠지만 프로그램을 구성하는 코드들을 동일하게 취할 수 있다는 점이다.
2. 컴파일 하는 방법 (w/ javac 옵션)
- 컴파일은 프로그래머가 작성한 코드를 바이트코드로 변환하는 것을 의미하는데 이는 JVM이 알아먹을 수 있는 내용으로 변환하는 것이다.
[출처: docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html]
javac [ options ] [ sourcefiles ] [ classes ] [ @argfiles ]
- javac는 컴파일을 하라는 명령어 이고,
- options에는 컴파일 옵션을 주는 것이다. 필요한게 있으면 출처의 docs를 참고하여 찾아보자.
나같은 경우는 예전에 Proguard 노가다를 하다 -nowarn, -verbose 를 썼던 기억이 있다. 물론 -nowarn은 에러외에는 보고 싶지않아서.. -verbose는 에러가 대체 어떻게 났는지 상세하게 알고 싶어서 사용했다;
무튼 옵션들을 찬찬히 보니, 쓸만한 건(?) 아래와 같다
1) -d 의 xxx.class파일들의 생성된 결과물의 디렉터리를 지정하는 것.
2) -source <버전> 을 통해 버전을 명시해주는 것은 관리차원에서 좋을 것 같다... 다만 1.5로 설정후 java로 실행해도 별 문제는 없었다. 내 컴퓨터에 java 버전이 많았으면 뭔가 더 재밌는 테스트를 해볼 수 있겠지만 일단 여기까지(...)
- classes에는 컴파일할 대상 파일
3. 실행하는 방법
[출처: docs.oracle.com/javase/7/docs/technotes/tools/windows/java.html]
java [ options ] class [ arguments ]
java [ options ] -jar xxxx.jar [ arguments ]
- java는 실행하라는 명령어이고,
- options에는 실행옵션을 주는건데, 나는 주로 -jar를 통해 OOOO.jar 파일을 실행해본적만 있다.
4. 바이트코드란 무엇인가?
다른 사람들 과제를 보니, 물론 다 본건 아니지만 가상머신이 이해할 수 있는 0과 1로 구성된 이진코드라고 하는데, 이진코드...라 이진코드면 바이너리 코드가 아닌가라는 생각이 들었다. 음 일단 뭐 찾다보니 맞는 얘기인 것 같은데 이진표현법이라면서 파일을 읽어보면 "^@^B^@^@^@^C^@^H^@^D^@^A^@^M^@^@^@^B^@^N" 이런 외계어들이 가득하다
jd-gui 통해서는 잘도 .java 로 돌아가면서 .class파일은 이게 이진표현법이라면서 뭔가 이진표현법이 맞나? 싶다 -_-;
결론적으로 바이트코드란 것은 프로그래머가 작성한 코드를 "자바 컴파일러(javac)"가 가상머신(자바라면 JVM , 안드로이드(구)라면 DVM)이 기계어로 변환할 때 필요한 재료라고 생각한다.
5. JIT 컴파일러란 무엇이며 어떻게 동작하는가?
[정의]
이어서 작성하자면 결국 JIT 컴파일러란, 바이트코드를 여러 기계에서 돌아갈 수 있게끔 해당 기계어로 변환해주는 것이다.
어떻게 동작하는지는 다음의 구성요소에서 자세히 작성하겠다.
6. JVM의 구성요소는 ?
앞서 5번에서 작성한것을 기반으로 간략히 말하자면, JVM의 구성요소는 Class Loader, Execution Engine, Runtime Data Area 로 구성되어 있다.
1) Class Loader는 클래스를 로딩하는 역할을 담당한다.
대상: jre/lib/rt.jar , jre/lib/ext/*.jar , 기타 등등...
순서:
- 클래스 Loading : .class 파일의 적재
- 클래스 Linking : .class가 잘 돌아갈지 "검증"하고 / 필요한 것들을 "준비"
- Initiailation : 클래스 변수들의 "초기화:
2) Execution Engine은 실행하는 역할을 담당하며, Interpreter, Compiler(JIT), GC(Garbage Collector)으로 구성되어 있다.
- Interpreter : 바이트코드를 한줄한줄 기계어로 변환해준다. 이때, 중복되는 코드가 있더라도 한줄한줄 실행하기에 그대로 수행한다.
- Compiler(JIT) : Interpreter의 단점(비효율성)을 해결하기 위해 도입되었으며 반복적인 코드들을 미리 기계어로 준비해두어 필요할 때 사용한다.
- GC(Garbage Collector) : Heap Area에서 안쓰는 것(? : 추후 자세히 정리할 예정...)들에 대해 메모리를 자유롭게 해준다
3) Runtime Data Area 는 아래와 같이 구성된다
- Method Area : 클래스, 변수, 상수등이 모여있는 공간
- Heap Area : 클래스의 인스턴스 들이 모여있는 공간
- Stack Area : 지역변수, 매개변수 들이 모여있는 공간
- PC Register : 프로그램카운터, 즉 현재 수행중인 명령의 주소값이 저장되는 공간
- Native Method Stack : 다른 언어의 메소드 호출을 위해 할당된다는데, 사실 잘 와닿지는 않는다.
7. JDK와 JRE이 차이
JDK는 Java Development Kit의 약자로, 자바 프로그램들을 구동 및 개발할 수 있게 해주는 환경을 의미하고,
JRE는 Java Runtime Environment의 약자로, 자바 프로그램들을 구동할 수 있게 해주는 환경을 의미한다.
수정 시 참고할 자료
javapapers.com/core-java/java-jvm-run-time-data-areas/#Program_Counter_PC_Register
docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/ClassLoader.html
'가치코딩 [Java] > 기초문법' 카테고리의 다른 글
[Java 문법] 예외처리 (0) | 2021.01.21 |
---|---|
[Java 문법] 클래스 (0) | 2020.12.18 |
[Java 문법] 선택문 및 반복문 (0) | 2020.12.08 |
[Java 문법] 자바 연산자 (0) | 2020.11.28 |
[Java 문법] 자바 데이터 타입, 변수 그리고 배열 (0) | 2020.11.18 |