IT Share you

Java 상수 풀의 목적은 무엇입니까?

shareyou 2020. 11. 16. 23:15
반응형

Java 상수 풀의 목적은 무엇입니까?


저는 현재 Java Virtual Machine의 사양을 더 깊이 파고 들려고 노력하고 있습니다. 나는 Inside the JVM book online을 읽고 있는데 이해하기 어려운 추상화가 하나 있습니다. Constant Pool. 다음은이 책에서 발췌 한 내용입니다.

로드하는 각 유형에 대해 Java 가상 머신은 상수 풀을 저장해야합니다. 상수 풀은 리터럴 (문자열, 정수 및 부동 소수점 상수) 및 유형, 필드 및 메소드에 대한 기호 참조를 포함하여 유형에서 사용하는 순서가 지정된 상수 세트입니다. 상수 풀의 항목은 배열의 요소와 마찬가지로 인덱스로 참조됩니다. 유형이 사용하는 모든 유형, 필드 및 메소드에 대한 기호 참조를 보유하기 때문에 상수 풀은 Java 프로그램의 동적 연결에서 중심 역할을합니다.

위와 CP에 대해 일반적으로 몇 가지 질문이 있습니다.

  1. CP .class는 각 유형의 파일에 있습니까?
  2. 저자는 "기호 참조"가 무엇을 의미합니까?
  3. 간단한 영어로 Constant Pool의 목적은 무엇입니까?

다이어그램을 사용하여 프레임을 구성하는 방법을 이해하면 도움이 될 것이라고 생각합니다.

여기에 이미지 설명 입력

프레임은 피연산자 (연산 명령)가있는 곳이며 동적 연결이 발생하는 곳입니다. 말하자면 상수 풀을 사용하여 클래스와 멤버를 추적하는 간단한 방법입니다.

각 프레임에는 런타임 상수 풀에 대한 참조가 포함됩니다. 참조는 해당 프레임에 대해 실행중인 메서드의 클래스에 대한 상수 풀을 가리 킵니다. 이 참조는 동적 연결을 지원하는 데 도움이됩니다.

C / C ++ 코드는 일반적으로 개체 파일로 컴파일 된 다음 여러 개체 파일이 함께 연결되어 실행 파일이나 dll과 같은 사용 가능한 아티팩트를 생성합니다. 연결 단계 동안 각 개체 파일의 기호 참조는 최종 실행 파일과 관련된 실제 메모리 주소로 대체됩니다. Java에서이 연결 단계는 런타임에 동적으로 수행됩니다.

Java 파일이 컴파일되면 변수 및 메소드에 대한 모든 참조가 기호 참조로 클래스의 상수 풀에 저장됩니다. 기호 참조는 실제로 물리적 메모리 위치를 가리키는 참조가 아닌 논리적 참조입니다.

자세한 내용은 James Blooms JVM 내부에 대한 링크 입니다.


상수 풀은 .class해당 클래스의 코드를 실행하는 데 필요한 상수를 포함하는 파일 (및 메모리 내 표현) 의 일부입니다 .

이러한 상수에는 프로그래머가 지정한 리터럴과 컴파일러가 생성 한 기호 참조가 포함됩니다. 기호 참조는 기본적으로 코드에서 참조되는 클래스, 메서드 및 필드의 이름입니다. 이러한 참조는 JVM에서 종속 된 다른 클래스에 코드를 링크하는 데 사용됩니다.

예를 들어, 다음 코드

System.out.println("Hello, world!");

다음 바이트 코드를 생성합니다 ( javap출력).

0:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;              
3:   ldc     #3; //String Hello, world!                                                  
5:   invokevirtual   #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V

#n여기 상수 풀에 대한 참조가 있습니다. #2심볼릭 참조 인 System.out필드, #3A는 Hello, world!문자열 #4을 참조 기호 인 PrintStream.println(String)방법.

보시다시피 기호 참조는 단순한 이름이 아닙니다. 예를 들어 메서드에 대한 기호 참조에는 매개 변수 ( Ljava/lang/String;) 및 반환 유형 ( V의미 void)에 대한 정보도 포함 됩니다.

javap -verbose해당 클래스에 대해 실행하여 클래스의 상수 풀을 검사 할 수 있습니다 .


간단한 영어로 Constant Pool의 목적은 무엇입니까?

CP는 중복성을 줄이기 위해 매우 고유 한 상수 값이 저장되는 메모리 영역입니다.

System.err.println("Hello");
System.out.println("Hello");

CP에는 문자열 객체 "Hello"가 하나만 있으며 컴파일러는 두 줄에서 동일한 참조로 대체합니다. .class 파일에는 Hello 문자열이 하나만 포함되어 있습니다. (다른 유형도 동일).

CP는 각 유형의 .Class 파일에 있습니까?

예, 여기를보십시오 : http://en.wikipedia.org/wiki/Java_class_file


문자열 상수 풀의 의미를 이해하기 위해 예제를 먼저 제공하십시오.

   public class StringConstantPool {
        public static void main(String[] args) {
            String s = "prasad";
            String s2 = "prasad";

            System.out.println(s.equals(s2));
            System.out.println(s == s2);
        }
    }

출력은

true

true 

여기서 단계별로 일어나는 일

1- JVM이 호출 될 때 클래스가로드됩니다.

2- JVM은 프로그램의 모든 문자열 리터럴을 찾습니다.

3- First, it finds the variable s which refers to the literal “prasad” and it will be created in the memory

4- A reference for the literal “prasad” will be placed in the string constant pool memory.

5- Then it finds another variable s2 which is referring to the same string literal “prasad“.

Now that JVM has already found a string literal “prasad“, both the variables s and s2 wil refer to the same object i.e. “prasad“.

여기에 이미지 설명 입력

I hope this be helpful

read more http://www.journaldev.com/797/what-is-java-string-pool

참고 URL : https://stackoverflow.com/questions/10209952/what-is-the-purpose-of-the-java-constant-pool

반응형