如何理解《Java编程思想-第四版》P23 中,这个变量直接存储“值”,并置于堆栈中,因此更加高效
一句中的 “堆栈” 两字,到底是堆还是栈?情况如下:
class demo {
private int var1; // 字段1
private Integer var2; // 字段2
public static void main(String[] args) {
int var3 = 0; // 变量1
demo obj1 = new demo(); // 实例1
}
}
参考《Java编程思想-第四版》P23 和 《深入理解Java虚拟机:JVM高级特性与最佳实践 第2版》P39-P43,对于该 demo
实例1:存储在堆内存中
变量1:存储在方法栈中
实例1中的字段1:存储在堆中
实例1中的字段2:存储在堆中
如果是存储在堆中的话,何来高效一说?
PHPz2017-04-18 10:54:21
일반적으로 모든 기본 유형의 데이터가 스택에 배치된다고 말할 수는 없습니다! 클래스 인스턴스에 기본 타입이 있으면 그 기본 타입이 힙에 위치하게 됩니다!
PHP中文网2017-04-18 10:54:21
메모리는 힙(Heap)과 스택(Stack)으로 구분됩니다. 이미 알고 계시죠?
힙 메모리는 JVM에 속하고, 스택 메모리는 메소드에 속합니다. 메소드가 끝나면 스택 메모리는 사라집니다.
프로그램이 메인 함수를 실행하면 힙 메모리와 메인 스택 메모리가 있습니다
int var3 = 0;
이 var3은 메인 함수의 스택 메모리에 위치하며 값입니다.
그 후
demo obj1 = new 데모();
메인 함수 obj1의 스택 메모리에는 힙 메모리의 새 인스턴스를 가리키는 참조 변수가 있습니다.
힙 메모리에 있는 이 인스턴스를 살펴보겠습니다. 여기에는 2개의 필드가 있으며 둘 다 힙에 저장되어 있습니다.
메인 함수가 종료될 때 다른 스레드가 실행 중이라면 JVM은 아직 종료되지 않은 것입니다. 이때 메인 함수의 스택 메모리는 지워지고 var3은 더 이상 존재하지 않으며 참조 변수 obj1은 없습니다. 더 길지만 힙 메모리의 인스턴스는 여전히 존재하며 다른 참조 변수가 이를 가리키지 않으면 나중에 지워집니다.
巴扎黑2017-04-18 10:54:21
是翻译错误,원문중용적是스택,即栈,而不是堆栈。以下是原文:
특수 사례: 기본 유형
프로그래밍에서 자주 사용하게 될 유형 그룹은 특별한 대우를 받습니다. 이를 "원시" 유형으로 생각할 수 있습니다. 특별하게 처리하는 이유는 new(특히 작고 단순한 변수)를 사용하여 객체를 생성하는 것이 그다지 효율적이지 않기 때문입니다. 왜냐하면 new는 객체를 힙에 배치하기 때문입니다. 이러한 유형의 경우 Java는 C 및 C++의 접근 방식을 따릅니다. 즉, new를 사용하여 변수를 생성하는 대신 참조가 아닌 "자동" 변수가 생성됩니다. 변수는 값을 직접 보유하며 스택에 배치되므로 훨씬 더 효율적입니다.