-
[Study] 자바 1주차 과제JAVA 2020. 11. 17. 21:55반응형
우연히 백기선님께서 자바 스터디를 진행하고 계신다는 것을 알게 되어 참여해보려 한다.
21일까지 1주차를 마감한다고 하시니까 관심 있은 분들은 아래의 유튜브를 참고하시길 바랍니다.
JVM이란 무엇인가
JVM은 Java Virtual Machine의 약자로 'Java를 실행시키기 위한 가상 기계' 라고 생각하면 됩니다.
보통 일반 프로그램은 실행되기 위해 운영체제(OS)가 메모리를 제어하여 실행이 되는 반면, Java 프로그램의 경우 JVM이 OS로부터 메모리를 할당받고 Java Compiler가 변환한 바이트 코드를 실행시킵니다.
그렇기에 Java는 OS에 종속적이지 않지만 JVM에 종속적입니다.
컴파일 하는 방법
이클립스나 인텔리제이와 같은 IDE를 이용해 자동으로 컴파일 할 수 있지만 직접 메모장과 cmd를 이용해 해보기로 했습니다.
1) 메모장을 이용해 Hello.java 파일을 만들어줍니다.
2) cmd를 실행시키고 javac 파일명.java 명령어를 이용해 Java 파일을 컴파일 시킵니다.
3) 컴파일에 성공해 Hello.class 파일이 생성되었습니다.
실행하는 방법
실행도 cmd를 이용해보겠습니다.
컴파일을 해 class 파일을 만들어져있으면 java 컴파일된 파일명 명령어를 이용해 실행시키면 됩니다.
바이트 코드란 무엇인가
앞에서 JVM은 Java Compiler가 변환한 바이트 코드를 실행시킨다고 했었죠?
바이트 코드는 JVM이 이해할 수 있는 언어로 변환된 자바 소스코드를 의미합니다.
컴파일러에 의해서 .java 파일이 바이트 코드로 이루어진 .class 파일로 변환이 되고 이를 JVM이 컴퓨터가 읽을 수 있는 기계어로 변환해주기 때문에 JVM만 있으면 운영체제에 상관없이 어디서든 실행이 가능한 것입니다.
cmd에서 javap -c 컴파일된 파일명 명령어를 입력해주시면 바이트 코드를 볼 수 있습니다.
JIT 컴파일러란 무엇이며 어떻게 동작하는지
다른 언어 프로그램은 프로그램 -> 컴파일러(최적화) -> 네이티브 코드 또는 프로그램 -> 인터프리터(직접실행) 방식인 반면 Java 프로그램은 프로그램 -> 컴파일러 -> 가상머신(최적화 및 직접실행)의 방식으로 실행됩니다.
이 때 가상머신에서 바이트 코드를 실행시키는 방식이 2가지가 있습니다.
하나가 인터프리터에 의해 바이트 코드 명령어를 하나씩 읽어서 해석하고 실행시키는 방법인데 하나하나의 실행은 빠르나, 전체적인 실행 속도가 느립니다.
다른 하나가 JIT (Just-In-Time) 컴파일러에 의해서 .class 바이트 코드를 네이티브 코드로 컴파일 하는 방식인데 이는 Java 프로그램의 성능을 향상시킵니다.
하지만, 바이트 코드를 네이티브 코드로 변환하는데에도 비용이 소요되므로 JVM은 모든 코드를 JIT 컴파일러 방식으로 실행하지 않고, 인터프리터 방식을 사용하다 일정 기준이 넘어가면 JIT 컴파일 방식으로 바이트 코드를 실행합니다.
JIT 컴파일러는 같은 코드를 매번 해석하지 않고 실행할 때 컴파일을 하면서 해당 코드를 캐싱해버립니다. 이후엔, 바뀐 부분만 컴파일 하고 나머지는 캐싱된 코드를 사용합니다. 그래서 인터프리터의 속도를 개선할 수 있는 것입니다.
JVM 구성 요소
이 부분은 전에 포스팅 했던 [JAVA] - 자바의 메모리 구조 에서 참고해서 글을 씁니다.
프로그램이 실행되면 JVM은 OS로부터 메모리를 할당 받고 이 메모리를 용도에 따라 4개의 영역으로 나누어 관리합니다.
1. Class Loader
class 파일을 Runtime Data Area에 적재해주는 기능을 가진 영역입니다. 위 그림처럼 Java 컴파일러에 의해서 바이트 코드로 변환된 Person.class 파일을 Class Loader가 Runtime Data Area에 저장시켜주는 모습을 볼 수 있습니다.
2. Excution Engine
저장된 class 파일(바이트 코드)를 플랫폼에 맞는 기계어로 변환시켜서 실행해줍니다.
위에서 JIT 컴파일러를 설명하면서 이 말이 나왔었죠?
바로 이 Excution Engine에서 인터프리터 방식 또는 JIT 컴파일러에 의해 바이트 코드가 실행이 됩니다.
3. Garbage Collector
Runtime Data Area 중 Heap 영역에 생성된 객체 중 참조하지 않는, 즉 사용하지 않는 객체들을 메모리에서 해제하는 역할을 합니다.
4. Runtime Data Area
JVM이 프로그램 수행을 위해 OS에게 할당 받은 메모리 영역으로 class 파일을 저장하며 이 영역은 5가지의 영역으로 나누어 집니다.
- Method Area (Class Area, Static Area)
클래스 내의 전역변수(멤버변수)의 이름, 데이터 타입, 접근제어자에 대한 Field 정보와 Method의 이름, 리턴 타입, 매개변수, 접근제어자에 대한 Method 정보 그리고 Type 정보, 상수 풀(Constant Pool), Class 변수 등을 저장합니다. - Heap Area
new 연산자로 생성된 객체와 배열을 저장하는 영역입니다. Class Area에 로드된 객체만 생성 가능하며 Garbage Collector를 통해 사용되지 않는 객체는 제거됩니다. - Stack Area
메소드가 호출되면 Stack 영역에 메모리가 할당이 됩니다. 이 때, 메소드 안에서 사용되어지는 값을 저장하며 매개변수, 지역변수 등을 임시로 저장합니다. Last In First Out 자료구조를 가지기에 나중에 들어온 Stack부터 순차적으로 수행되며 수행이 끝나면 프레임별로 삭제됩니다. - PC register
Thread가 생성될 때마다 만들어지는 공간으로 어떤 부분을 어떤 명령으로 실행할 지에 대한 기록이 저장됩니다. 또한 현재 실행되는 부분의 명령과 주소를 저장합니다. - Native Method Stack
자바 외의 다른 언어(C, C++ 등)에서 제공되는 메소드들이 저장되는 공간입니다.
JDK와 JRE의 차이
- JRE (Java Runtime Environment, 자바 실행 환경)
JRE는 말그대로 Java 프로그램이 실행할 수 있도록 해주는 환경으로 변환과 실행을 해주는 JVM과 표준 라이브러리(Java API)가 포함되어 있습니다.
JRE = JVM + 표준 라이브러리 - JDK (Java Development Kit, 자바 개발 도구)
Java 프로그램을 개발자들이 쉽게 만들 수 있도록 해주는 개발자용 도구입니다. JRE와 자바 개발에 필요한 여러가지 명령어 그리고 컴파일러를 포함하고 있습니다.
JDK = JRE + Java Tool, Java Compiler
References
728x90'JAVA' 카테고리의 다른 글
[Study] 자바 3주차 과제 (0) 2020.11.28 [Study] 자바 2주차 과제 (0) 2020.11.21 [JAVA] 제네릭(Generic) 이란? (0) 2020.11.15 [JAVA] StringTokenizer (0) 2020.10.28 클래스, 객체, 인스턴스 (0) 2020.09.21 - Method Area (Class Area, Static Area)