# 학습해야 하는 목록 

  • 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의 약자로, 자바 프로그램들을 구동할 수 있게 해주는 환경을 의미한다. 

 

수정 시 참고할 자료 

homoefficio.github.io/2018/10/13/Java-%ED%81%B4%EB%9E%98%EC%8A%A4%EB%A1%9C%EB%8D%94-%ED%9B%91%EC%96%B4%EB%B3%B4%EA%B8%B0/

 

Java 클래스로더 훑어보기

Java ClassLoader 훑어보기아주 예전에 SCJP 시험볼 때나 살펴본 이후로 자바의 클래스로더를 직접 다뤄야 할 일은 솔직히 없었다. 그래서 거의 잊고 살아왔는데 요즘 Quartz를 다루면서 Quartz에 없는 기

homoefficio.github.io

 

d2.naver.com/helloworld/1230

javapapers.com/core-java/java-jvm-run-time-data-areas/#Program_Counter_PC_Register

 

Java JVM Run-time Data Areas - Javapapers

Understanding Java Virtual Machine (JVM) run-time data areas are critical to better Java programming. One of the most dreaded errors in Java is OutOfMemoryError and it is related to Java Virtual Machine (JVM) memory areas. We should have better understandi

javapapers.com

docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/ClassLoader.html

 

ClassLoader (Java SE 11 & JDK 11 )

Converts a ByteBuffer into an instance of class Class, with the given ProtectionDomain. If the given ProtectionDomain is null, then a default protection domain will be assigned to the class as specified in the documentation for defineClass(String, byte[],

docs.oracle.com

 

+ Recent posts