Program Club

Java 프리미티브는 스택 또는 힙으로 이동합니까?

proclub 2021. 1. 6. 20:00
반응형

Java 프리미티브는 스택 또는 힙으로 이동합니까?


기본이 아닌 객체 (객체)는 힙으로 가고 메서드는 스택으로 이동하지만 기본 변수는 어떻습니까?

--최신 정보

답변을 바탕으로 힙이 주어진 객체에 대해 새로운 스택과 힙을 가질 수 있다고 말할 수 있습니까? 객체에 기본 변수와 참조 변수가 있다는 점을 감안할 때 ..?


로컬로 정의 된 프리미티브는 스택에 있습니다. 그러나 프리미티브가 오브젝트 인스턴스의 일부로 정의 된 경우 해당 프리미티브는 힙에 있습니다.

public class Test {
    private static class HeapClass {
        public int y; // When an instance of HeapClass is allocated, this will be on the heap.
    }
    public static void main(String[] args) {
        int x=1; // This is on the stack.
    }
}

업데이트와 관련하여 :

개체에는 자체 스택이 없습니다. 내 예에서는 int y실제로 각 인스턴스의 일부입니다 HeapClass. HeapClass의 인스턴스가 할당 될 때마다 (예 new Test.HeapClass():) HeapClass의 모든 멤버 변수가 힙에 추가됩니다. 따라서의 인스턴스가 HeapClass힙에 할당 되므로의 인스턴스의 int y일부로 힙에 HeapClass있습니다.

그러나 모든 메서드의 본문에 선언 된 모든 기본 변수는 스택에 있습니다.

위의 예에서 볼 수 있듯이 int x는 클래스의 멤버가 아닌 메서드 본문에서 선언 되었기 때문에 스택에 있습니다.


모든 지역 변수 (메서드 인수 포함)는 스택에 있습니다. 개체 및 모든 해당 필드는 힙에 저장됩니다. 변수는 항상 원시 또는 객체에 대한 참조 입니다.

Java 구현은 실제로 사양을 준수하는 방식으로 힙에 객체를 저장할 수 있습니다. 마찬가지로 지역 변수는 레지스터에 저장되거나 최적화를 통해 불명료해질 수 있습니다.


프리미티브는 두 곳 모두에서 찾을 수 있습니다.

class Foo
{
   public int x;
   public static void Main()
   {
      int y = 3; // y is on the stack
      Foo f = new Foo();  // f.x is probably on the heap
   } 
}

JVM을 구축하지 않는 한 정말 신경 쓰지 말아야합니다. 정말 영리한 옵티마이 저는 f가 Main을 이스케이프하지 않도록 가리키는 Foo가 절대로 Main을 이스케이프하지 않고 다른 함수로 전달되지 않으므로 스택에 할당하는 것이 안전하다고 결정할 수 있습니다.

업데이트와 관련하여 :

스택과 힙은 저장된 내용이 아니라 제공되는 작업으로 구분됩니다. 스택을 사용하면 LIFO 방식으로 메모리 조각을 할당 할 수 있습니다. 모든 조각이 할당 해제 될 때까지 조각을 할당 해제 할 수 없습니다. 이것은 호출 스택이 사용되는 방식과 편리하게 일치합니다. 함수가 반환 될 때 그 일이 사라지는 것이 괜찮다면 스택에 무엇이든 넣을 수 있습니다. 이 방식으로 만 사용할 수 있도록 지원하므로 스택에서 할당 및 할당 해제가 매우 빠르기 때문에 이것은 최적화입니다. 원하는 경우 구현의 힙에 함수에 대한 모든 지역 변수를 저장할 수 있습니다. 힙은 더 유연하고 결과적으로 사용 비용이 더 많이 듭니다. 제가 말했듯이 객체에 스택과 힙이 있다고 말하는 것은 정확하지 않습니다.


원시 값은 객체의 필드가 아닌 경우 스택에 할당되며,이 경우 힙으로 이동합니다. 스택은 평가 및 실행에 사용되므로 기본 필드가있는 객체에 스택이 있다고 말하는 것은 의미가 없습니다. 여전히 힙의 일부로 간주됩니다. Stack객체 조차도 힙에 할당됩니다.

참조 URL : https://stackoverflow.com/questions/3646632/do-java-primitives-go-on-the-stack-or-the-heap

반응형