1. 자바로 Hello, World 출력하기
Printing to stdout
public class Solution {
public static void main(String[] args) {
/* Enter your code here. Print output to STDOUT. Your class should be named Solution. */
System.out.println("Hello, World.");
System.out.println("Hello, Java.");
}
}
자바 응용프로그램은 자바가상머신(JVM, Java Virtual Machine)에서 실행된다.
JVM은 자바 응용프로그램으로 부터 전달받은 명령을 해당 운영체제가 이해할 수 있도록 변환하여 전달한다.
(운영체제나 하드웨어와 관련된 일은 JVM이 하는것이다.)
자바 컴파일러는 Java안에 있는 Java .class file을 컴파일 한다. 그리고 .class 파일을 JVM에 넣어 수행한다.
1. 클래스 로더 서브시스템
자바의 동적 클래스 로딩은 클래스 로더 서브시스템으로 구현된다. 처음 runtime 시간에 클래스 파일을 로드, 링크, 초기화 한다.
컴파일시간이 아닌 런타임 시간에 수행된다.
1.1 로딩
1. 부트스트랩 클래스 로더 : rt.jar을 로딩함
2. 확장 클래스 로더 : jre\lib ext 폴더를 로딩함
3. 어플리케이션 클래스로더 : 어플리케이션 계층의 클래스경로를 로딩함
1.2 링킹
verify - verification이 실패하면 verification error를 받게 되는데 그것을 체크함
prepare - default values를 할당함
resolve - Method Area에서 original references를 가져와 모든 All symbolic memory references 를 대체함
1.3 초기화
모든 static variables을 original values로 당하고 static block이 시작시킴
2. Runtime Data Area (JVM 메모리 구조라고 알고 있는 부분)
1. Method Area - Static Variables을 포함하여 모든 클래스 계층의 데이터를 저장하고 있는 장소
2. Heap Area - 각 JVM마다 존재하는 힙 (저장공간)은 멀티 쓰레드를 위해 메모리를 공유하는 장소
모든 오브젝트와 new 연산자에 의해 생성되는 변수들과 배열들이 모두 여기에 생성되고 보관됨
3. Stack Area - Runtime stack에 생성되며 모든 쓰레드를 위한 저장소
모든 메서드 콜을 위해 스택 구조로 만들어져 있으며, Stack Frame 이라고 부름
모든 local 변수들은 스택 메모리에 저장됨
메서드가 호출되면 메서드 수행에 필요한 메모리공간을 할당받고 메서드가 종료되면 사용하던 메모리를 반환함
4. PC Registers
모든 쓰레드는 PC Registers에 분리되어 있으며 현재 수행 instruction의 주소가 저장되어 있고, 수행할 때 다음
instruction이 PC registers에 저장될 것임.
5. Native Method stacks
모든 쓰레드를 위해 분리된 스택공간이 생성됨
3. Execution Engine
bytecode는 런타임 데이터 장소에 할당되고 execution engine에 의해 수행된다.
3.1 Interpreter
bytecode를 빠르게 해석할 수 잇지만 수행하는 것은 느림
하나의 메서드가 다중시간에 호출 됬을때 매 시간마다 새로운 인터프리테이션이 요구됨
3.2 JIT Compiler
JIT 컴파일러는 인터프리터의 단점을 중화시킴
Execution Engine은 인터프리터를 돕는데 수행되지만 반복된 코드를 찾을때는 JIT 컴파일러를 사용함
JIT 컴파일러는 모든 bytecode를 컴파일하고 native code로 변환함
네이티브 코드는 반복된 메서드 호출을 위해 직접적으로 사용되어 성능을 향상시킴
3.3 Garbage Collector
사용이되지 않은, unreferenced 된 오브젝트를 모으고 제거한다. System.gc() 를 호출하여 사용할 수 있음
4. Java Native Interface (JNI)
Native Method Libraries와 사이에서 작용하여 Native Libraries를 Execution Engine에 제공하기 위해서 사용됨
5. Native Method Libraries
Execution Engine에서 필요로하는 Native Libraries들의 집합
2. 수행 구조 예제
public class Solution {
public static void main(String[] args) {
/* Enter your code here. Print output to STDOUT. Your class should be named Solution. */
System.out.println("Hello, World.");
System.out.println("Hello, Java.");
}
}
hackerrank.com 에서 헬로우 월드를 출력한 클래스를 기준으로 본다면
처음 로더에서 경로를 받아오고 링크하여 컴파일을 한 후, 자바 파일을 수행한다.
그 후에 호출 스택 장소에 public static void main() 클래스가 스택에 들어간 후
System.out.println() 함수가 들어감 -> 수행되고 나면 해당 함수는 반환되고 스택을 빠져나감
main이 마지막에 반환되면 프로그램이 종료 !
'컴퓨터공학 > Java 정리' 카테고리의 다른 글
java study day1-2 (0) | 2016.12.21 |
---|---|
java study day1-1 (0) | 2016.12.21 |