정적 메소드와 정적 변수는 Java에서 어디에 저장됩니까?
예를 들면 :
class A {
static int i=0;
static int j;
static void method() {
// static k=0; can't use static for local variables only final is permitted
// static int L;
}
}
이러한 변수는 Java, 힙 또는 스택 메모리에 어디에 저장됩니까? 그들은 어떻게 저장됩니까?
정적 메서드 (사실상 모든 메서드)와 정적 변수는 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의 변경 사항을 확인하지 않았으므로 위의 내용이 해당 버전에 대해 여전히 사실 이라고 생각 합니다. 하지만 여기서 확실하지 않습니다.
클래스 변수 (정적 변수)는 Class object
해당 클래스와 관련된 일부로 저장됩니다 . 이 클래스 개체는 JVM에서만 만들 수 있으며 permanent generation
.
또한 일부는 비 힙 영역에 저장되어 있다고 대답했습니다 Method Area.
.이 대답도 틀리지 않습니다. Permgen Area가 힙의 일부인지 여부는 논쟁의 여지가있는 주제입니다. 분명히 인식은 사람마다 다릅니다. 제 생각에는 JVM 인수에서 힙 공간과 permgen 공간을 다르게 제공합니다. 따라서 그것들을 다르게 취급하는 것은 좋은 가정입니다.
그것을 보는 또 다른 방법
메모리 풀은 런타임 동안 JVM 메모리 관리자에 의해 생성됩니다. 메모리 풀은 힙 또는 비힙 메모리에 속할 수 있습니다. 런타임 상수 풀은 클래스 파일에있는 constant_pool 테이블의 클래스 별 또는 인터페이스 별 런타임 표현입니다. 각 런타임 상수 풀은 JVM (Java Virtual Machine)의 메소드 영역에서 할당되며 정적 변수는이 메소드 영역에 저장됩니다. 또한,이 비 힙 것도 없지만 파마 겐 area.Actually 메소드 영역 파마 겐의 일부이다. ( 참조 )
이것은 간단한 대답과 장황한 대답이있는 질문입니다.
간단한 대답은 힙입니다. 클래스 및 클래스에 적용되는 모든 데이터 (인스턴스 데이터 아님)는 힙의 영구 생성 섹션에 저장됩니다.
긴 대답은 이미 스택 오버플로에 있습니다.
There is a thorough description of memory and garbage collection in the JVM as well as an answer that talks more concisely about it.
Prior to Java 8:
The static variables were stored in the permgen space(also called the method area).
PermGen Space is also known as Method Area
PermGen Space used to store 3 things
- Class level data (meta-data)
- interned strings
- static variables
From Java 8 onwards
The static variables are stored in the Heap itself.From Java 8 onwards the PermGen Space have been removed and new space named as MetaSpace is introduced which is not the part of Heap any more unlike the previous Permgen Space. Meta-Space is present on the native memory (memory provided by the OS to a particular Application for its own usage) and it now only stores the class meta-data.
The interned strings and static variables are moved into the heap itself.
For official information refer : JEP 122:Remove the Permanent Gen Space
It is stored in the heap referenced by the class definition. If you think about it, it has nothing to do with stack because there is no scope.
In addition to the Thomas's answer , static variable are stored in non heap area which is called Method Area.
As static variables are class level variables, they will store " permanent generation " of heap memory. Please look into this for more details of JVM. Hoping this will be helpful
static variables are stored in the heap
'IT story' 카테고리의 다른 글
열거 형 클래스를 기본 형식으로 변환 할 수 있습니까? (0) | 2020.08.17 |
---|---|
클래스 속성을 통해 C # 반복 (0) | 2020.08.17 |
문자열에서 첫 x 문자를 제거 하시겠습니까? (0) | 2020.08.17 |
범위 내에서 임의의 정수를 생성하는 방법 (0) | 2020.08.15 |
jquery $ (window) .height ()는 문서 높이를 반환합니다. (0) | 2020.08.15 |