정적 메서드 (사실상 모든 메서드)와 정적 변수는 PermGen
리플렉션 데이터 (인스턴스 관련 데이터가 아닌 클래스 관련 데이터)의 일부이기 때문에 힙 섹션에 저장됩니다 .
설명을위한 업데이트 :
PermGen 공간에는 변수와 해당 기술 값 (프리미티브 또는 참조) 만 저장됩니다.
정적 변수가 객체에 대한 참조 인 경우 객체 자체는 힙의 일반 섹션 (젊음 / 오래된 세대 또는 생존자 공간)에 저장됩니다. 이러한 객체 (클래스 등과 같은 내부 객체가 아닌 경우 )는 PermGen 공간에 저장 .
예:
static int i = 1; //the value 1 is stored in the PermGen section
static Object o = new SomeObject(); //the reference(pointer/memory address) is stored in the PermGen section, the object itself is not.
가비지 컬렉션에 대한 한마디 :
마십시오 하지 의지finalize()
실행이 보장 . 객체가 가비지 수집에 적합하더라도 가비지 수집기를 실행할시기와 수집 대상을 결정하는 것은 전적으로 JVM의 몫입니다.
물론 정적 변수를 null로 설정하여 힙의 개체에 대한 참조를 제거 할 수 있지만 그렇다고 가비지 수집기 가이를 수집 한다는 의미 는 아닙니다 (더 이상 참조가 없더라도).
또한 finalize()
한 번만 실행되므로 예외가 발생하지 않거나 개체가 수집되지 않도록해야합니다. 일부 예외를 통해 종료를 중지 finalize()
하면 동일한 개체에서 두 번째로 호출되지 않습니다.
마지막 참고 : 코드, 런타임 데이터 등이 저장되는 방법은 사용되는 JVM에 따라 다릅니다. 즉, HotSpot은 JRockit과 다르게 수행 할 수 있으며 동일한 JVM의 버전 간에도 다를 수 있습니다. 위의 내용은 Java 5 및 6 용 HotSpot을 기반으로합니다 (기본적으로 동일 함). 답변 당시 대부분의 사람들이 해당 JVM을 사용했다고 말하고 있기 때문입니다. Java 8에서 메모리 모델의 주요 변경 사항으로 인해 위의 설명은 Java 8 HotSpot에 대해 사실이 아닐 수 있으며 Java 7 HotSpot의 변경 사항을 확인하지 않았으므로 위의 내용이 해당 버전에 대해 여전히 사실 이라고 생각 합니다. 하지만 여기서 확실하지 않습니다.