소스코드(hello.c) -> 전처리(preprocess) -> 전처리 후 소스(hello.i) -> Compiler ->
Assembly소스(hello.s) -> Assembler -> 오브젝트파일(hello.o) -> Linker -> 실행파일(hello.out) ->
Loader -> Memory
좀더 자세히 보자
런타임 환경의 과정이 위 그림의 JVM부분과 같다 즉, JVM은 런타임 프로세스
: 토큰 스트림을 통해서 문법에 맞는지 확인하는 과정
: 컴파일시 생성되는 중간 코드 = 바이트 코드
클래스의 modifier 정보를 나타낸다
name | value | 의미 |
---|---|---|
ACC_PUBLIC | 0x0001 | 클래스가 public, 다른 클래스에서 접근이 가능 |
ACC_FINAL | 0x0010 | 클래스를 상속할 수 없다 |
ACC_SUPER | 0x0020 | invokespecial 인스트럭션은 수퍼클래스의 메서드를 호출함 |
ACC_INTERFACE | 0x0200 | interface임을 명시 |
ACC_ABSTRACT | 0x0400 | abstract임을 명시 |
ACC_SYNTHETIC | 0x1000 | 소스 코드에서 명시적으로 선언되지 않고 컴파일러에서 생성되었음을 의미 |
ACC_ANNOTATION | 0x2000 | annotation @interface임을 명시 |
ACC_ENUM | 0x4000 | enum class 임을 명시 |
ACC_MODULE | 0x8000 | module임을 명시 |
// 예를 들어서 다음과 같은 코드가 있다면
Object print(String str, int i)
// Type의 표현으로 다음과 같이 표현가능하다
(java/lang/String;I)Ljava/lang/Object;
JVM이 동적으로 코드를 실행시킬 때 모든 데이터를 즉시 생성하는 것이 아니라,
constant pool에 저장 후 Constant pool에 존재하는 데이터를 우선적으로 가져와 메모리를 더욱 효율적으로 사용할 수 있게한다
런타임에 생성되는 Static 상수 저장소
즉, 정적영역에 있는 메모리이기에 GC의 대상 x
#
해시코드로 시작하는 특징
Constant pool에서 제공하는 타입
type | bit |
---|---|
Integer(Boolean,Short,Byte 상수는 Integer 취급 | 32bit |
Float | 32bit |
Double, Long | 64bit |
String | 16bit(실제값이 아닌 주소값이 저장된다) |
public class Test {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
해당 코드를 javap 명령(javac Test.java, javap -c Test)을 통해 bytecode를 보면
// 이렇게 나온다
public class bridge.view.Test {
public bridge.view.Test();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public java.lang.String getName();
Code:
0: aload_0
1: getfield #2 // Field name:Ljava/lang/String;
4: areturn
public void setName(java.lang.String);
Code:
0: aload_0
1: aload_1
2: putfield #2 // Field name:Ljava/lang/String;
5: return
}
aload_0
: local variable 을 stack 에 push 한다, 0은 frame안 instruction 위치invokespecial
: instance Method 를 호출하고 결과를 stack 에 push한다.https://velog.io/@jieuni/%EC%8B%9C%EC%8A%A4%ED%85%9C%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8DAssembler
https://www.geeksforgeeks.org/cc-preprocessors/
https://catch-me-java.tistory.com/9
https://github.com/gyoogle/tech-interview-for-developer/blob/master/Language/%5Bjava%5D%20%EC%9E%90%EB%B0%94%20%EC%BB%B4%ED%8C%8C%EC%9D%BC%20%EA%B3%BC%EC%A0%95.md
https://wonit.tistory.com/589
https://wonit.tistory.com/588
https://d2.naver.com/helloworld/1230
https://docs.oracle.com/javase/specs/jvms/se16/html/jvms-4.html
https://www.baeldung.com/jvm-constant-pool
https://jiwondev.tistory.com/114#head5