인스턴스 필드 (속성 백업 필드 포함)는 N- 개체에 대한 N 개 사본을 가져옵니다.
정적 필드는 클래스 당 하나의 사본을 얻습니다.
메소드는 프로그램 "이미지"또는 실행 코드 세그먼트의 일부인 바이트 코드 블록 (또는 JIT 이후의 고유 명령어 블록)입니다. 메소드는 디스크에있을 때 이미 프로그램 이미지의 일부입니다. 이미지가 OS (또는 CLR)에 의해로드되면 메소드 코드의 단일 공유 사본이 있습니다.
호스트 가능한 컴파일러를 사용하여 새 메소드를 즉시 컴파일 할 수있는 경우를 제외하고는 일반적으로 "힙"또는 런타임 할당의 일부가 아닙니다. 메소드는 오브젝트와 같이 "할당"되지 않으며 오브젝트 작성에 대해 "할당"되지 않습니다. 그것들은 단일 객체가 인스턴스화되기 전에 단지 프로그램의 일부로 존재합니다. 람다 / 델리게이트조차도 즉시 할당되지 않습니다. 컴파일러는 동적으로 보이는 이러한 다른 코드 객체를 구현하기 위해 주문형 클래스를 만들고 디스크의 바이트 코드 이미지의 일부로도 존재합니다.
댓글 당 업데이트 :
JVM 표준은 다음과 같이 말합니다.
2.5.4. 방법 영역
Java Virtual Machine에는 모든 Java Virtual Machine 스레드간에 공유되는 메소드 영역이 있습니다. 방법 영역은 기존 언어의 컴파일 된 코드를위한 저장 영역과 유사하거나 운영 체제 프로세스의 "텍스트"세그먼트와 유사합니다. 런타임 상수 풀, 필드 및 메소드 데이터와 같은 클래스 별 구조와 클래스 및 인스턴스 초기화 및 인터페이스 초기화에 사용되는 특수 메소드 (§2.9)를 포함한 메소드 및 생성자 코드를 저장합니다.
메소드 영역은 가상 머신 시작시 작성됩니다. 메소드 영역은 논리적으로 힙의 일부이지만 간단한 구현에서는 가비지 수집 또는 압축을 선택하지 않을 수 있습니다. 이 버전의 Java Virtual Machine 사양에는 메소드 영역의 위치 나 컴파일 된 코드를 관리하는 데 사용되는 정책이 필요하지 않습니다. 방법 영역은 고정 된 크기 일 수 있거나 계산에 의해 요구되는대로 확장 될 수 있고, 더 큰 방법 영역이 불필요 해지면 수축 될 수있다. 메소드 영역의 메모리는 연속적 일 필요는 없습니다.
따라서 (1) 예가이 작업을 수행하는 방법을 지시하지는 않지만 (2) 기존 언어의 컴파일 된 코드, 즉 저장 영역과 유사하다는 것이 분명합니다. 텍스트 세그먼트 이것이 내가 만드는 요점입니다.