2011-12-08 2 views
0

누구든지이 예제에서 메모리가 현저하게 (스택 & 힙) 발생하는 것을 설명 할 수 있습니까? 내가 올바르게 이해한다면 자바는 힙에 객체를 저장한다. 그래서 i1은 힙에있을 것이다 ... 문자열과 같은가? 하지만 i2는 클래스 필드 선언이라고 생각하면 어떨까요?Java (스택 및 힙) -이 간단한 예제에서 메모리가 현저하게 발생합니다.

public ExampleClass { 
    Integer i1=new Integer(1); 
    int i2 = 2; 
    String str = "abc"; 
} 
+1

만약 그것이 'ExampleClass' 객체의 일부라면, 결국 어디에서 끝날까요? –

답변

0

new ExampleClass()과 같은 코드가 없으면 아무런 변화가 없습니다. 일단 그렇게하면 힙에 새로운 객체가 할당됩니다. 이에 포함 된 내용은 i1, i2str입니다. 당신이 방법이 아니기 때문에 i2이 자동으로 뒤에서 Integer i2 = new Integer(0)으로 변환 될 것입니다. 이 참조 중 3 개는으로, 힙에도 할당 된 객체를 가리 킵니다. 문자열은 불변이므로, "abc" 값을 가진 String이 이미 있다면, 그 참조는이를 가리킬 것입니다. 하나 개의 스레드에 로컬 인스턴스/프리미티브 가능한 스택 매장

+3

"i2는 장면 뒤에서 자동으로 Integer i2 = new Integer (0)"로 변환됩니다. 그렇지 않습니다. –

1

이들 모두는 힙에 저장됩니다. SO 태그로서

말한다 :

힙 동적 할당 방치 프로세스 메모리이다.

따라서 변수는 힙에 배치됩니다.

그러나 모든 기본 유형 (int, float 등)은 스택에 저장됩니다 ** 메소드 내에 로컬로 할당 된 경우에만).

자세한 내용은 here을 참조하십시오.

0

매우 간결한 : Stack: [i1-addr, 2, str-addr]Heap : [i1-addr : 1, str-addr : 'a','b','c']. 힙에 대해서는 표기법 [addres: value]을 사용합니다. 물론, heap of value heap은 어떤 오브젝트 정보 (예 : .class 오브젝트에 대한 링크)를 포함합니다.

0
public ExampleClass { 
    Integer i1=new Integer(1); //heap 
    int i2 = 2; //heap 
    String str = "abc"; //permGen 
} 

가 힙 (스레드의 개수에 가능한) 공유 장소, permGen는이 구금 저장하는 데 사용되는 자바 메모리의 다른 부분 문자열 및로드 된 클래스

0

모든 초기화 값은 생성자에서 설정됩니다. 생성자에서 참조는 스택에 배치 된 다음 힙의 필드에 배치됩니다. 생성자가 반환하면 객체 자체에 대한 참조는 여전히 스택에 있지만 모든 필드는 힙에만 있습니다.