2013-07-11 1 views
5

Java에서 JVM (예 : HotSpot)은 JIT 컴파일이 가능하며이 기술은 바이트 코드를 원시 코드로 컴파일하여 실행 속도를 높이는 데 사용됩니다. 내 질문은 어떻게 기술적으로 이런 일이 일어나는가하는 것입니다. 필자는 현대 프로세서가 메모리 영역을 읽기 전용 섹션과 악의적 인 코드 실행을 방지하기 위해 실행 가능한 섹션으로 표시한다는 사실을 이해했습니다. 따라서 JVM은 실제로 액세스 할 수있는 메모리 공간 (즉, 자체 수정 코드)에 새로운 "실행 코드"를 작성할 수 없습니다. 따라서 JVM이 원시 코드를 생성하고이를 파일에 기록한 다음 운영 체제 서비스를 사용하여 해당 원시 코드를 메모리에 동적으로로드하고 원시 코드 (함수) 위치의 주소에 대한 내부 매핑 테이블을 유지한다고 추측합니다. 운영 체제가이 동적 코드를로드 한 후에 메모리에 저장되므로 기본 명령어로 분기 할 수 있습니다.Java에서 JIT 컴파일은 어떻게 동적으로 컴파일 된 명령어를 메모리에로드합니까?

나는이 대답을 보았습니다 : How is JIT compiled code injected in memory and executed?,하지만 운영 체제가 사용자 프로그램에 READ + EXECUTE 메모리 영역을 허용하는 이유에 대해서는 혼란 스럽습니다. 리눅스 등 다른 운영체제가 JIT가 작동하기 위해 비슷한 것을 제공합니까?

누군가 내 이해를 명확히하는 데 도움이 될 수 있습니까?

답변

3

리눅스에서는 메모리 세그먼트를 쓰기 및 실행 가능하도록 설정할 수 있으며 나중에 보호 영역에서 변경할 수 있습니다. mmap(2)mprotect(2) syscalls을보십시오.

JVM은 디스크 파일을 사용하지 않고 메모리에 기계 코드를 생성합니다. JIT 기계는 아마도 실행 메모리에 바이트를 씁니다.

JVM은 생성 된 기계 코드 보호를 변경하지 않을 수도 있습니다 (쓰기 가능한 메모리 세그먼트와 실행 가능 메모리 세그먼트 내에서 모든 기계 코드를 생성 할 수 있음). 코드를 생성하기 때문에 불쾌한 일을하지 마십시오 (proof-carrying code에 대해 읽으십시오).

, 당신은 자신의 소스 코드를 공부할 수

일부의 JVM은 (예를 들어, OpenJdk 내부의 하나) 무료 소프트웨어를 Just-in-time compilationHotSpotVirtual Memory 위키 페이지를 읽고, 일부 java 과정을 -ing strace을 시도합니다.

관련 문제