2015-01-24 2 views
7

그래서 나는이 방법은 자바로 작성했습니다 :JIT 컴파일 된 코드는 어디에 있습니까?

public void myMethod(int y){ 
    int x = 5 + y; 
    doSomething(x); 
} 

그리고

자바 가상 머신에이 방법을 위해 컴파일 된 코드를 실행할 때 .. 내 응용 프로그램이이 시대의 많은 호출 가정, JVM는 것이다 먼저이 방법을 해석하십시오. 그리고 얼마 후, 올바르게 이해하면 기계어로 컴파일하기로 결정할 것입니다. 이 시점에서

,

는이 메모리 머신 코드로 덮어 쓸 수 있을까요? 덮어 쓴다면 크기 차이 문제는 어떻게 해결됩니까? 메모리의 다른 위치에 쓰여지는 경우 바이트 코드가 메모리에로드되거나 해제됩니까? 또한 바이트 코드와 jit 컴파일 된 코드가 모두 메모리에있는 경우 응용 프로그램이이 메서드에 다시 도달하면 JVM은 바이트 코드 대신 jit 컴파일 된 코드를 어떻게 실행하기로 결정합니까?

+0

이런 종류의 일은 당신이 윈도우 머신에서 실행 중인지 아니면 RAM이 부족한 마이크로 컨트롤러에서 실행 중인지에 달려 있다는 생각이 들었다. 다른 말로하면, 플랫폼 의존, 아니? – Ghostkeeper

+2

답변 1 : 왜 신경 쓰시겠습니까? 답변 2 : JVM은 클래스 객체의 내부 표현에서 테이블을 통해 링크 된 C 힙의 각 메소드에 대한 JITCed 코드를 유지합니다. 코드는 JVM이 끝나거나 클래스가 "언로드"되는 드문 경우에만 삭제됩니다. 그것은 모두 적절한 마술에 의해 관리됩니다. –

+1

"C 힙"은 정말로 잘못된 이름입니다. malloc (페이지 정렬 일 수도 있고 아닐 수도 있습니다) 호출을 사용하여 얻은 메모리를 참조하는 경우 해당 페이지는 실행 가능으로 표시되어야합니다. 아마도 JIT는 mmap, VirtualAlloc 등을 사용하여 생성 된 코드에 메모리를 할당합니다. –

답변

12

HotSpot JVM에는 Metaspace (또는 이전 버전의 PermGen)에 Method 구조가 있습니다. 메서드 바이트 코드를 덮어 씁니다. a pointer to compiled code, 메서드가 컴파일 될 때까지 처음에는 NULL입니다. - 바이트 코드 인터프리터에 대한 포인터

  • _i2i_entry :

    하는 방법은 여러 진입 점을 가질 수있다.

  • _code->entry_point() - JIT 컴파일 코드의 진입 점. 컴파일 된 메소드는 CodeCache에 있습니다. 동적으로 생성 된 VM의 원시 메모리의 특수 영역입니다.
  • i2cc2i 어댑터는 컴파일 된 코드를 인터프리터에서 호출하며 반대의 경우도 마찬가지입니다. 해석 방법과 컴파일 방법에 통역으로 폴백 드문 트랩을 가질 수있는 다른 호출 규칙 (인수가 전달되는 방법을 방법, 프레임 구성 방법 등)

컴파일 방법을 가지고 있기 때문에 이러한 어댑터가 필요하다 드문 경우들. 게다가 Java 메소드는 여러 번 동적으로 재 컴파일 될 수 있으므로 JVM은 원래의 바이트 코드를 버릴 수 없습니다. 어쨌든 바이트 코드는 컴파일 된 코드보다 훨씬 작기 때문에 이것을 해제하는 것은 의미가 없습니다.

5

아니요, 일반적으로 동일한 장소에있는 두 가지 표현에 실용적인 이점이 없기 때문에 덮어 쓰지 않습니다. JVM 바이트 코드는 단지 데이터 조각입니다. JIT에서 생성 된 코드는 네이티브 CPU 명령어의 스트림입니다 (일부 아키텍처에서는 이것이 실행 가능으로 명시되어 있어야합니다).

일반적으로 새 함수를 실행해야하는 경우 JIT 컴파일러는 해당 함수의 바이트 코드를 읽고 다른 위치에 메모리를 할당하고 해당하는 원시 코드를 해당 메모리에 쓴 다음 새로 입력 한 함수 포인터를 반환합니다 생성 된 네이티브 코드.

+1

또한 많은 현대 플랫폼에서 가상 메모리 하위 시스템에서 * 실행 가능 * 메모리를 명시 적으로 요청해야합니다. 실행 코드 페이지에 바이트 코드를 할당 할 이유가 없습니다. –

2

내가 아는 한, The Java® Virtual Machine Specification은 그 어떤 것도 지정하지 않습니다.

[...] 이러한 변환기의 일례는 플랫폼 특정 명령어를 생성하는 적시 (JIT) 코드 생성기이다
I 찾을 수 JIT 유일한 참조 Chapter 3에 자바 가상 머신 코드가로드 된 후에 만. 이 장에서는 코드 생성과 관련된 문제는 다루지 않으며 Java 프로그래밍 언어에서 Java Virtual Machine 지침으로 작성된 소스 코드 컴파일과 관련된 문제 만 다루고 있습니다.

제 생각에 이것은 다른 구현에 따라 다르게 수행 될 수 있습니다.

그러나 Java 명령을 포함하는 메모리가 네이티브 CPU 명령어로 덮어 쓰여지지 않는 것 같습니다. CPU 명령어가 기술적으로 실행 가능하고 바이트 코드가 해석되어야하기 때문에 바이트 코드가 데이터이기 때문입니다. 그것은 아주 이상한 일이긴하지만 불가능하지 않습니다.

관련 문제