문제

힙 메모리는 자바에서 수집 된 쓰레기입니다.

스택 쓰레기도 수집 되었습니까?

스택 메모리는 어떻게 되 찾을 수 있습니까?

올바른 솔루션이 없습니다

다른 팁

스택의 메모리에는 메소드-파라미터 및 로컬 변수가 포함되어 있습니다 (정확하게 : 원시 유형에 대한 객체 및 변수 자체에 대한 참조). 메소드를 떠나면 자동으로 제거됩니다. 변수가 참조 (객체에) 인 경우 객체 자체가 힙에 있고 쓰레기 수집기가 처리합니다.

따라서 스택은 힙과 같은 방식으로 수집 된 쓰레기가 아니지만 스택은 자체적으로 자동 메모리 관리의 한 형태입니다 (쓰레기 수집).

더 자세한 답변은 Thomas Pornin이 제공합니다, 자세한 내용은 자세한 내용을 확인하십시오.

스택은 자바에서 수집 된 쓰레기가 아닙니다.

주어진 메소드 호출에 할당 된 스택은 메소드가 반환 될 때 해제됩니다. 그것은 매우 간단한 Lifo 구조이므로 쓰레기 수집이 필요하지 않습니다.

스택과 쓰레기 수집이 상호 작용하는 곳 중 하나는 스택의 참조가 GC 루트라는 것입니다 (이는 도달 가능성이 결정된 루트 참조임을 의미합니다).

스택 ~할 수 있었다 쓰레기를 수집하십시오. 그러나 대부분의 JVM 구현에서는 정의상 쓰레기 수집을 배제하는 "스택"으로 처리됩니다.

우리가 스택이라고 부르는 것은 축적입니다 방법 활성화 컨텍스트: 호출 된 각 방법에 대해, 이것은 메소드 인수, 로컬 변수, 호출 방법의 컨텍스트에 대한 숨겨진 포인터 및 명령 포인터를 저장하는 슬롯을 포함하는 개념적 구조입니다. 활성화 컨텍스트는 Java 언어 자체와 같이 액세스 할 수 없습니다. 방법이 종료 될 때 컨텍스트는 쓸모가 없습니다 ( return 또는 예외로 인해). 방법 A가 메소드 B를 호출 할 때 A가 A가 제어를 회복 할 때 B의 컨텍스트가 쓸모 없게된다는 보장됩니다. 이것은 B에 대한 컨텍스트의 수명이 A에 대한 문맥의 수명의 하위 인이라는 것을 의미합니다. 따라서 활성화 컨텍스트 (주어진 스레드의 경우)는 Lifo ( "마지막, 첫 번째,") 징계로 할당 될 수 있습니다. 더 간단한 단어로, 스택 : 새로운 활성화 컨텍스트가 컨텍스트 스택 위에 푸시되고 상단의 컨텍스트가 가장 먼저 처분 될 것입니다.

실제로 활성화 컨텍스트 (또한 호출 스택 프레임)는 전용 영역에서 스택 순서로 연결됩니다. 해당 영역은 스레드가 시작될 때 운영 체제에서 얻어지고 스레드가 종료 될 때 운영 체제를 다시 가져옵니다. 스택의 상단은 종종 CPU 레지스터에 포함 된 특정 포인터로 지정됩니다 (JVM이 코드를 해석하는지 또는 컴파일하는지에 따라 다름). "발신자의 컨텍스트에 대한 포인터"는 가상입니다. 발신자의 컨텍스트는 반드시 스택 순서 바로 아래에 있습니다. GC는 개입하지 않습니다. 스택의 영역은 스레드 활동 자체에서 생성되고 동기식으로 재생됩니다. 이것은 또한 다음과 같은 많은 언어로 작동하는 방식입니다. , GC가 전혀없는 것.

이제 힙에 활성화 컨텍스트를 할당하고 GC에 의해 수집 한 JVM 구현이 달리 수행되는 것을 막는 것은 없습니다. 스택 할당이 더 빠르기 때문에 일반적으로 Java 가상 머신에서는 수행되지 않습니다. 그러나 다른 일부 언어는 그런 일, 특히 그와 같은 언어를 수행해야합니다. 연속 여전히 GC를 사용하는 동안 (예 : 계획 그리고 그것 call-with-current-continuation 기능), 그러한 게임은 위에서 설명한 Lifo 규칙을 깨뜨리기 때문에.

메모리의 스택 부분은 "스택"처럼 작동합니다. 나는 그것이 나쁘게 들리지만 그것이 정확히 작동하는 방식입니다. 데이터는 서로 상단에 추가됩니다 (pushed onto the stack) 및 상단에서 자동으로 제거됩니다 (popped off the stack) 프로그램이 진행됨에 따라. 쓰레기가 수집되지 않았으며 데이터가 스택에서 튀어 나오면 메모리가 자동으로 재생되기 때문에 가능하지 않습니다. 그리고 내가 재생된다고 말할 때 나는 그것이 할당 된 것을 의미하지는 않습니다. 데이터가 꺼지면서 다음 데이터가 저장 될 스택 메모리의 위치가 줄어든다는 것입니다.

물론 스택에 대해 전혀 걱정할 필요가 없다고 말하는 것은 아닙니다. 재귀 기능을 여러 번 실행하면 결국 모든 스택 공간을 사용합니다. 많은 기능을 호출하는 경우, 특히 많은 매개 변수 및/또는 로컬 변수가있는 경우에도 마찬가지입니다.

그러나 결론은 스택의 메모리가 기능이 자동으로 들어가고 남기면서 사용되고 재생된다는 것입니다. 따라서 프로그램 실행이 끝나면 모든 스택 메모리가 무료이며 운영 체제로 다시 릴리스됩니다.

스택에 사용 된 메모리를 참조하면 수집 된 쓰레기가 아닙니다.
Java Virtual Machine은 명시 적 바이트 코드 지침을 사용하여 스택에서 메모리를 예약하고 해제합니다. 이러한 지침은 컴파일러에 의해 생성되고 Stack의 int, Boolean, Double 및 Object-references와 같은 프리미티브의 수명을 관리합니다.
소위 테일 콜 최적화를 구현할 계획이 있었는데, 더 이상 사용되지 않는 것으로 알려진 후에 스택에서 일부 항목을 제거 할 수 있지만 이미 지원하는 JVM은 모릅니다.
따라서 스택 자체에 대한 쓰레기 수집은 없으며, 컴파일러는 메모리 사용을 관리하기위한 푸시 및 팝 지침 만 생성했습니다.

스택 자체는 스레드의 일부입니다. 스레드 객체가 생성되고 스레드가 종료 된 후에는 쓰레기가 수집되고 스레드 객체가 더 이상 참조되지 않으면 스택이 할당됩니다.

Java의 모든 물체는 힙에 할당됩니다. (적어도 사양이 진행되는 한, 실제 구현은 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 스택에 할당 될 수 있습니다.)

정확히 수집 가능한 것은 약간 미묘합니다. 객체에 대한 유일한 참조가 단일 스택 프레임에 있고 참조가 다시 사용되지 않는다는 것을 보여줄 수 있다면 객체를 수집 할 수 있습니다. 객체가 필드를 읽는 데만 사용되는 경우 해당 필드 판독 값은 앞으로 최적화되고 예상보다 일찍 수집 될 수 있습니다.

결승 자 (또는 아마도 아마도 Reference에스). 이 경우 조심해야하고 잠금/휘발성을 사용하여 happens-before 관계.

스레드가 중지되면 일반적으로 전체 스택이 처리됩니다.

스택에있는 모든 것은 쓰레기 수집가에 의해 글로벌 뿌리로 취급됩니다. 그렇습니다. 스택은 "쓰레기 수집"이라고 말할 수 있습니다.

메서드, 메소드 호출 등의 내부 변수가 있으므로 데이터를 푸시하고 스택에서 튀어 나오지 않습니다.

아니요. 스택은 자바에서 수집 된 쓰레기가 아닙니다. 각 스레드에는 자체 스택이 있으며 다음과 같습니다.

  1. 방법 별 값 (수명이 짧음) 및
  2. 힙에 생성 된 객체에 대한 참조는 방법에 의해 언급되고 있습니다.

이 값은 모든 메소드 호출에 대한 스택 프레임으로 스택 프레임으로 푸시됩니다. 스택은 '최후의 첫 번째 아웃'순서를 따르기 때문에 모든 메소드 호출의 끝에서 모든 메소드 특정 데이터를 포함하는 각 스택 프레임과 객체에 대한 참조가 팝업됩니다.

따라서 메소드/프로그램이 범위를 벗어나면 스택의 데이터가 자동으로 정리됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top