찾다

 >  Q&A  >  본문

java 基本数据类型各种情况下在内存中存储位置?

问题:

如何理解《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

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

黄舟黄舟2803일 전587

모든 응답(4)나는 대답할 것이다

  • PHPz

    PHPz2017-04-18 10:54:21

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

    회신하다
    0
  • PHP中文网

    PHP中文网2017-04-18 10:54:21

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

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

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

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

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

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

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

    회신하다
    0
  • 巴扎黑

    巴扎黑2017-04-18 10:54:21

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

    특수 사례: 기본 유형

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

    회신하다
    0
  • 巴扎黑

    巴扎黑2017-04-18 10:54:21

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

    회신하다
    0
  • 취소회신하다