2009-08-30 2 views

답변

2

정적 메모리를 사용하면 스택에, 아니오이면 모든 객체가 힙에 할당됩니다. 스택에는 프리미티브 만 할당됩니다.

편집 : 동적 및 정적으로 각각 힙 및 스택을 의미하는지 아직 확실하지 않지만 C/C++ 배경을 가진 사람들이 일반적으로 질문을하는 곳입니다. 그걸로. 자바에서

, 당신은 전형적인를 수행 할 때 힙에 메모리를 할당합니다

Object o = new Object(); 

. 방법 내부 경우 당신이 할 : (이, 다음은 힙에 할당 될 클래스의 필드 인 경우)
int i = 1; 

그런 다음 그 INT는 스택에 할당됩니다.

+0

정적 할당과 동적 할당의 예를 모두 제공 해주시겠습니까 ?? –

0

모든 인스턴스 메모리 (new를 호출하여)가 힙에 할당되고 모든 매개 변수가 스택에 할당됩니다. 그러나 java (기본이 아닌) 매개 변수는 모두 참조로 전달됩니다 (기본 프리미티브 제외).

+2

Java에서 모든 매개 변수는 값으로 전달됩니다. –

+2

모든 인스턴스는 인스턴스에 대한 포인터와 같은 참조에 의해 전달됩니다. 포인터는 값에 의해 전달되지만, 전달 된 객체의 메소드를 호출하면 원래 값이 변경됩니다. –

+1

정확히, Java는 항상 값에 의해 전달되므로 객체 참조도 값으로 전달됩니다 (Java 객체는 항상 참조를 통해 액세스). 그것은 참조 기준과는 완전히 다릅니다. http : // stackoverflow.com/questions/40480/is-java-pass-by-reference –

-1

비 - 프리미티브가 항상 힙에 할당되었다는 해답은 잘못된 것입니다.

JVM은 을 사용하여 개체가 항상 단일 스레드로 제한되는지 여부와 개체의 수명이 지정된 스택 프레임의 수명으로 제한되는지 여부를 확인할 수 있습니다. 객체가 스택에 할당 될 수 있다고 판단 할 수있는 경우 JVM이 객체를 스택에 할당 할 수 있습니다.

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

+1

Java 6u14 (-XX : + DoEscapeAnalysis가 사용되는 경우)는 스택 할당이 아닌 스칼라 교체를 위해 이스케이프 분석을 사용합니다. 객체는 * 스택에 * 결코 * 할당되지 않지만 필드는 인라인되어 로컬 변수로 취급됩니다. http://java.sun.com/javase/6/webnotes/6u14.html을 참조하십시오. –

0

'정적'은 '스택에 있음'을 의미하지 않습니다.

클래스 - 정적 변수의 초기화에 할당 된 객체 또는 static code blocks은 클래스로드 시간 (프로그램 시작 직후 정적으로 발생할 수 있음)에서 할당한다는 의미에서 정적으로 할당됩니다.

당신은 이론적으로 그러한 할당만을 사용하여 Java 프로그램을 작성할 수 있으며, 결코 malloc을 호출하지 않은 C 프로그램과 마찬가지로 statically allocated 일 것입니다. 단지 원하는 작업에 대한 고정 버퍼를가집니다.

이러한 프로그램이 성공적으로 시작되면 수행 할 수있는 모든 작업에 사용할 수있는 메모리가 충분하므로 메모리 부족 오류, 조각화 문제 또는 GC 일시 중지가 발생하지 않습니다.

정확하게 쓰여지면 '할 수 없다'는 오류 메시지가 많이 표시됩니다.