사용자 도구

사이트 도구


wiki:java:코드조작

문서의 이전 판입니다!


더 자바, 코드를 조작하는 다양한 방법

JVM(Java Virtual Machine)

  • 자바 가상 머신으로 자바 바이트 코드(.class)를 OS에 특화된 코드로 변환(인터프리터와 JIT 컴파일러)하여 실행한다.
  • 바이트 코드를 실행하는 표준(JVM 자체는 표준)이자 구현체(특정 밴더가 구현한 JVM)이다.
  • JVM 밴더: 오라클, 아모존, Azul,
  • 특정 플랫폼에 종속적
Java11 부터는 Jre를 제공하지 않음
Java9부터 모듈 개념이 들어옴

JRE, JDK

오라클에서 만든 자바11 버전부터는 상용으로 사용할 때 유료 오라클에서 만든 open-jdk는 버전 업그레이드도 되고 무료

JVM에서 구동되는 언어로는

 클로저, 그루비, JRuby, Jython, 코틀린, ...

JVM 구조

클로스 로더 시스템

  • 로딩: 클래스의 메모리 로딩
  • 링크: 클래스간 연결(레퍼런스 연결)
  • 초기화: 각 클래스, 변수 초기화

메모리

  • 메소드
    • 클래스명, 부모 클래스명(상속 클래스) 정보 저장
    • 공유 영역
    • 객체저장, 인스턴스 저장

스택, PC(PC registers), 네이티브 메소드 스택

  • 쓰레드 단위로 저장

실행 엔진(Execution Engine)

  • 인터프리터: 바이트 코드를 한 줄씩 실행
  • JIT(Just In Time) 컴파일러: 인터프리터 효율을 높이기 위해, 인터프리터가 반복되는 코드를 발견하면

JIT 컴파일러로 반복되는 코드를 모두 네이티브 코드로 바꿔둔다. 그 다음부터 인터프리터는 네이티브 코드로 컴파일된 코드를 바로 사용한다.

  • GC(Garbage Collector): 더 이상 참조되지 않는 객체를 모아서 정리한다.

바이트 코드 보기

$> javap -c ${클래스 파일 경로}
Compiled from "CodeManipulationApplication.java"
public class com.repia.java.codemanipulation.CodeManipulationApplication {
  public com.repia.java.codemanipulation.CodeManipulationApplication();
    Code:
       0: aload_0
       1: invokespecial #8                  // Method java/lang/Object."<init>":()V
       4: return
 
  public static void main(java.lang.String[]);
    Code:
       0: ldc           #1                  // class com/repia/java/codemanipulation/CodeManipulationApplication
       2: aload_0
       3: invokestatic  #16                 // Method org/springframework/boot/SpringApplication.run:(Ljava/lang/Class;[Ljava/lang/String;)Lorg/springframework/context/ConfigurableA
pplicationContext;
       6: pop
       7: return
}
/volume1/web/dokuwiki/data/attic/wiki/java/코드조작.1651127346.txt.gz · 마지막으로 수정됨: 2022/04/28 15:29 저자 dhan