2012-07-27 2 views
2

개체는 다른 개체에 대한 참조를 포함 할 수 있습니다. 이러한 참조를 클래스/필드 변수로 선언하면 개체 자체가 힙에 만들어 지므로 필드 참조가 나타내는 값은 힙에 저장됩니다.로컬 참조 및 필드 참조 메모리 할당

그래서, 난이있는 경우

public class A { 
    int size; 
} 
  • 내가 크기가 다음 2의 int 값을 얻는 경우에 그 힙에 객체의 일부로 저장되는 것을 알고 있지만, 어디 이름 즉 참조입니다 크기가 저장 되었습니까?
  • "크기"라는 이름은 힙의 개체 내부에도 저장되어 있습니까?
  • JVM이 힙에 size == 2을 어떻게 상호 참조합니까?
  • 클래스를로드 할 때 주 스레드에서 실행되며 각 스레드는 자체 스택을 갖습니다. 그래서 이러한 필드 참조가 메인 스택에 올바르게 생성되지 않았습니까?

답변

1

여기서 "크기"라는 이름이 저장되어 있습니까?

필드 이름은 클래스 개체 A.class에 저장됩니다. java.lang.reflect 라이브러리를 사용하여 클래스 필드 이름을 검사 할 수 있습니다.

예를 들어, 클래스의 모든 필드를 검사하려면 다음을 수행하십시오

이름 "크기"또한 힙에 객체의 내부
for (Field field : A.class.getFields()) { 
    String fieldName = field.getName(); 
    Class<?> fieldClass = field.getType(); 
    // etc 
} 

저장되어 있습니까?

번호는 permgen 메모리

에 저장되고 어떻게 힙에 JVM의 상호 참조 크기 == 2?

그것은 컴파일 시간에 현장을 조회하고 나머지는 바이트 코드에서 일어나는

필드 참조는 주요 스택에 만들어지지 않는다?

아니요. 힙 및 스택보다 많은 메모리 영역이 있으며, 클래스 정의 및 클래스 필드가 저장되는 permgen도 있습니다. 가비지 컬렉터와 같은 더 많은 메모리 영역이 여전히 있습니다.

+0

보헤미안, 이름 크기가 permgen 메모리에 있지만 힙에있는 클래스 정의 파일 안에 저장되어 있다고 말하는 것입니까? – Phoenix

+0

@Phoenix 필드의 이름이 클래스 정의에 있고 클래스 정의가 permgen이므로 필드 이름도 permgen입니다 (클래스 정의 내에 중첩 됨). – Bohemian

+0

보헤미안, 필드 참조가 다른 객체에 대한 참조 인 경우 어떻게해야합니까? 원시적이 아닌가? A 급처럼 (B 이름;)? – Phoenix