2017-03-27 4 views
0

런타임 상수 풀의 일부 속성에 대해 잘 모르겠습니다.런타임 상수 풀 - 런타임에 생성 된 변수로 채워 집니까?

런타임 상수 풀은 상수 풀 (클래스로드 중 .class 파일의 데이터)로 채워집니다. 하지만 런타임에 작성된 변수로 채워져 있습니까? 아니면 컴파일 과정에서 리터럴로 변환되고 상수 풀에 저장됩니까? 예를 들어

는 :

Integer i = new Integer(127); 

때문에로 다시 전환, 문자처럼 취급 : 편집시

Integer i = Integer.valueOf(127); 

및 상수 풀에 저장?

그런 식으로 작동하지 않는다면 런타임 상수 풀에 대한 런타임 메커니즘이 있습니까?

둘째 질문 : 나는이 기사를 많은 기사에서 발견했습니다. "모든 클래스에 런타임 상수 풀이 있습니다."하지만 의미는 무엇입니까? 하나의 RCP가 있습니다 (예 : 정수 유형의 모든 응용 프로그램 개체가 포함되어 있습니까?) 또는이 클래스에서 발생하는 모든 상수 개체를 포함하는 모든 클래스에 대해 하나의 RCP가 있습니까? (예 : Person, got age = Integer (18), isAdult = Boolean (true)).

답변

2

첫째, 이러한 구조는 완전히 다르다

Integer i = Integer.valueOf(127); 

Integer i = new Integer(127); 

어떠한 변환도 없다. new Integer(127)은 평가 될 때마다 새 인스턴스를 생성하는 반면, 은 Integer.valueOf-128 … +127 범위의 모든 값을 보장하므로 모든 평가에서 동일한 인스턴스가 생성되도록 보장됩니다. 이것은 Integer.valueOf(int)의 구현에 의해 처리되며 어떤 식 으로든 상수 풀과 관련이 없습니다. 물론 이것은 구현에 따라 다르지만 OpenJDK 구현에서는 간단히 filling an array with references to these 256 instance the first time, this cache is accessed으로 처리합니다.

모든 클래스에 constant pool in its class file이있는 것이 맞지만 모든 클래스에 런타임 정수 풀이 있다고 말하는 것은 잘못된 것일 수 있습니다. 다시 JVM 구현 세부 사항입니다. 각 클래스 상수 풀 1 : 1을 런타임 상수 풀에 매핑하는 것은 가능하지만 동일한 해결 컨텍스트에있는 클래스의 상수 풀 (즉 동일한 클래스 로더로 정의 됨)을 하나의 풀로 병합하는 것이 분명합니다. 동일한 상수는 여러 번 해결할 필요가 없습니다. 개념 상 모든 클래스는 비록이 순진한 형식으로 구현하지 않더라도 풀의 런타임 표현을 가지고 있습니다. 따라서 "모든 클래스에는 런타임 상수 풀이 있습니다"라는 문구는 잘못은 아니지만 반드시 모든 클래스에 대해 이와 같은 데이터 구조가 있음을 의미하지는 않습니다.

는이 클래스의 상수 풀에 의해 참조 클래스, 멤버, MethodType, MethodHandleString 인스턴스에 영향을하지만, 정수 풀에서 그러한 항목이 없기 때문에, Integer 또는 Boolean 같은 유형의 래퍼 없습니다. 풀의 정수 값은 프리미티브 값이며 부울 값은 전혀 존재하지 않습니다.

전역 참조 번호 String 풀 참조 String 리터럴 인스턴스와 intern() 호출 결과와 혼동하지 마십시오.

1

문제 1 - Anwser : 없음

Integeral 래퍼 유형 없다는 아닌 정수 풀에 저장 캐시. 그것들은 힙의 보통 객체 일뿐입니다. Integer 또는 Byte 캐싱은 런타임 최적화이며 VM 최적화가 아니며 컴파일 시간 최적화도 아닙니다. 그들은 마술처럼가 생성자가 새로운 것을 생성하기 위해 호출 될 때 캐시 된 것으로 바뀌지 않습니다.

먼저 new Integer(127)에서 Integer.valueOf(127)으로의 번역이 post에서 설명한대로 올바르지 않습니다. System.out.println(Integer.valueOf(127) == new Integer(127)); (인쇄물 false)과 같은 런타임 확인을 수행하면 new 연산자를 사용하여 생성중인 개체가 상관없이 항상 새로운 캐시되지 않은 개체를 생성한다는 결론을 빨리 내릴 수 있습니다. (런타임 상수 테이블에 실제로 임에도 String들, 정식 하나에 대한 참조를 얻을 수 구금 될 필요는 없다.)

i 변수 보류 그냥 힙의 Integer 객체를 가리키는 참조입니다 무엇. valueOf을 사용하는 경우 캐싱되며 반대의 경우도 마찬가지입니다.


문제 2 - Anwser :이 모든 클래스에 대해 하나의 RCP하지만 그들은 모두 모든 method area에 저장되어있는 같은 메모리 영역

RCPs에 있습니다. 개인적으로 나는 JVM 구현하는 방법을 모르겠지만, JVM들은 stated 있습니다

Java 가상 머신은 당 형 상수 풀을 유지

(§2.5.5)의 많은를 제공하는 런타임 데이터 구조 종래의 프로그래밍 언어 구현의 기호 테이블의 목적.

그럼에도 불구하고 Oracle에서 작업을 신청할 계획이 아니라면 이것은 성능 조정보기에서도 중요하지 않습니다.