java 基本数据类型各种情况下在内存中存储位置?
黄舟
黄舟 2017-04-18 10:52:21
0
4
533

问题:

如何理解《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:存储在堆中

如果是存储在堆中的话,何来高效一说?

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

모든 응답(4)
PHPzhong

일반적으로 모든 기본 유형의 데이터가 스택에 배치된다고 말할 수는 없습니다! 클래스 인스턴스에 기본 타입이 있으면 그 기본 타입이 힙에 위치하게 됩니다!

Ty80

메모리는 힙(Heap)과 스택(Stack)으로 구분됩니다. 이미 알고 계시죠?

힙 메모리는 JVM에 속하고, 스택 메모리는 메소드에 속합니다. 메소드가 끝나면 스택 메모리는 사라집니다.

프로그램이 메인 함수를 실행하면 힙 메모리와 메인 스택 메모리가 있습니다

int var3 = 0;
이 var3은 메인 함수의 스택 메모리에 위치하며 값입니다.

그 후
demo obj1 = new 데모();
메인 함수 obj1의 스택 메모리에는 힙 메모리의 새 인스턴스를 가리키는 참조 변수가 있습니다.

힙 메모리에 있는 이 인스턴스를 살펴보겠습니다. 여기에는 2개의 필드가 있으며 둘 다 힙에 저장되어 있습니다.

메인 함수가 종료될 때 다른 스레드가 실행 중이라면 JVM은 아직 종료되지 않은 것입니다. 이때 메인 함수의 스택 메모리는 지워지고 var3은 더 이상 존재하지 않으며 참조 변수 obj1은 없습니다. 더 길지만 힙 메모리의 인스턴스는 여전히 존재하며 다른 참조 변수가 이를 가리키지 않으면 나중에 지워집니다.

巴扎黑

是翻译错误,원문중용적是스택,即栈,而不是堆栈。以下是原文:

특수 사례: 기본 유형

프로그래밍에서 자주 사용하게 될 유형 그룹은 특별한 대우를 받습니다. 이를 "원시" 유형으로 생각할 수 있습니다. 특별하게 처리하는 이유는 new(특히 작고 단순한 변수)를 사용하여 객체를 생성하는 것이 그다지 효율적이지 않기 때문입니다. 왜냐하면 new는 객체를 힙에 배치하기 때문입니다. 이러한 유형의 경우 Java는 C 및 C++의 접근 방식을 따릅니다. 즉, new를 사용하여 변수를 생성하는 대신 참조가 아닌 "자동" 변수가 생성됩니다. 변수는 값을 직접 보유하며 스택에 배치되므로 훨씬 더 효율적입니다.

巴扎黑

p22, stack은 스택, heap은 힙을 의미합니다

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!