문제

나는 로컬 변수와 방법의 매개 변수가 스택에 살고 있다는 것을 알고 있지만 Java의 경우 실제로 방법이 어디에 살고 있는지 알 수 없습니까?

다음과 같은 스레드 객체를 선언하는 경우

Thread t=new Thread();
t.start();

따라서 주요 방법과는 별도의 방법을 별도로 호출했음을 의미합니다. 무슨 뜻인가요? 스택 메모리를 통해 별도의 메소드 시퀀스를 호출한다는 의미입니까? 내가 맞아?

도움이 되었습니까?

해결책

각 스레드는 자체 스택으로 할당됩니다.

이 기사 Java 프로세스 내에서 메모리 분리에 대한 좋은 소개가 있습니다.

Java Virtual Machine 내부에는 각 스레드에 Java 스택이 수여되는데, 여기에는 로컬 변수, 매개 변수 및 스레드가 호출 한 각 메소드의 리턴 값을 포함하여 다른 스레드에 액세스 할 수없는 데이터가 포함되어 있습니다. 스택의 데이터는 원시 유형 및 객체 참조로 제한됩니다. JVM에서는 실제 물체의 이미지를 스택에 배치 할 수 없습니다. 모든 물체는 힙에 있습니다.

고객이 각 스레드가 거의 수행하지 않고 메모리 문제가 발생한다는 근거로 스레드 서버를 구현 한 많은 시나리오를 보았습니다. 각 스레드가 자체 스택으로 할당되기 때문입니다. 나 생각한다 기본값은 스레드 당 512k이지만 그에 대한 표준 소스를 찾지 못했습니다.

다른 팁

내가 올바르게 기억한다면, 메소드 코드 자체는 메모리의 코드 부분에 남아 내부적으로 선언 된 변수가 스택에 남아 힙에 객체가 생성됩니다. Java에서는 가변 포인터와 프리미티브가 스택에 살고 있으며 생성 된 물체는 힙에 살고 있습니다.

(가난한) ASCII 표현의 경우 :

-------
|STACK|
-------
|FREE |
-------
|HEAP |
-------
|CODE |
-------

스택이 스택을 나타내고, 자유는 자유 메모리를 나타내고, 힙은 힙을 나타내고, 코드는 코드 공간을 나타냅니다.

이것이 내 기억의 말입니다. 세부 사항 중 일부는 잘못되었을 수 있습니다.

스택은 메소드 호출로 구성됩니다. Java가 스택에 푸시하는 것은 메소드 호출 레코드로, 해당 메소드의 모든 변수 (매개 변수 및 로컬 인스턴스화 변수 모두)를 캡슐화합니다. Java 응용 프로그램을 시작하면 기본 메소드 (Args 매개 변수를 자동으로 포함)는 스택에서 유일한 것입니다.

main(args)

foo 객체를 만들고 foo.method ()을 호출한다고 말하면 이제 스택은 다음과 같습니다.

method()
main(args)

방법이 호출되면 스택으로 밀려 나가면 스택에서 제거되거나 "튀어 나옵니다". 변수가 선언되고 스택 항목을 사용하여 현재 방법 (스택 상단)에 해당하는 스택 항목이 변수의 크기를 포함하도록 성장합니다.

스레드와 함께 예제의 경우 각 스레드에는 자체 스택이 서로 독립적 인 스레드 스택과 독립적입니다.

스택에는 모든 로컬 변수와 모든 활성 메소드 호출이 포함되어 있습니다. 힙은 다른 모든 것을 붙잡고 있습니다.

하위 질문에 관해서는 : 자체 전용 메모리로 새로운 스택이 생성된다는 것을 의미합니다. 새 스레드는 JVM이 할당 한 총 힙 공간 (메모리)을 공유합니다.

힙은 여러 세대로 나뉩니다.

바이트 코드와 그 골판지 JIT 컴파일 된 기계 코드는 인턴 된 문자열 및 기타 클래스 데이터와 함께 소위 영구 생성에 살고 있습니다.

"영구적 인"세대라고하지만 여전히 쓰레기를 수집 할 수 있습니다. 일부 라이브러리, 프레임 워크 및 JVM 언어는 런타임에 바이트 코드를 생성하므로 영구 생성이 때때로 정리해야합니다. 힙의 다른 세대와 마찬가지로 (일반적으로 희망)는 덜 자주.

실제 바이트 코드 및/또는 JIT'D 코드는 프로세스의 메모리에 남아 있습니다. 주어진 프로세스의 모든 스레드가 해당 메모리를 공유하기 때문에 프로세스 메모리에는 하나의 사본 만있을 수 있습니다. 모든 변수 공유 이러한 스레드는 공동 메소드에 의해 액세스됩니다. 스레드에 로컬로 변수 (스레드 내에서 사용되는 메소드 로컬 변수조차도 해당 스레드의 메모리 내에서 생성됩니다.

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