Java의 정적 멤버 변수는 힙 메모리 또는 스택 메모리에 배치됩니까?

高洛峰
풀어 주다: 2016-10-13 15:25:49
원래의
2196명이 탐색했습니다.

힙 영역:

1. 모든 객체가 저장되며, 각 객체에는 해당 클래스에 대한 정보가 포함됩니다. (클래스의 목적은 연산 명령을 얻는 것입니다.)
2.jvm에는 모든 스레드가 공유하는 하나의 힙 영역(힙)만 있습니다. 기본 유형 및 객체 참조는 힙에 저장되지 않고 객체 자체만 저장됩니다.
스택 영역:
1. 각 스레드에는 기본 데이터 유형의 개체와 사용자 지정 개체에 대한 참조만 스택에 저장됩니다. 개체는 힙 영역에 저장됩니다.
2. 각 스택의 데이터(원본 유형 및 객체 참조)는 비공개이며 다른 스택에서 액세스할 수 없습니다.
3. 스택은 기본형 변수 영역, 실행 환경 컨텍스트, 연산 명령 영역(저장소 연산 명령)의 3개 부분으로 나누어집니다.
메서드 영역:
1. 정적 영역이라고도 하며 힙과 마찬가지로 모든 스레드가 공유합니다. 메소드 영역에는 모든 클래스 및 정적 변수가 포함됩니다.

2. 메소드 영역에는 클래스 및 정적 변수와 같이 전체 프로그램에서 항상 고유한 요소가 포함됩니다.


프로그램이 실행될 때 데이터를 어디에 저장할지 알아두는 것이 좋습니다. 내부 할당에 특별한 주의가 필요합니다. 데이터를 저장할 수 있는 위치는

1. 이는 다른 모든 저장과는 다른 위치, 즉 프로세서 내부에 있기 때문에 가장 빠른 저장 영역입니다. 그러나 레지스터 수는 매우 제한되어 있으므로 필요에 따라 컴파일러에서 레지스터를 할당합니다. 우리는 이에 대해 직접적인 통제권을 가지고 있지 않으며 우리 프로그램에서 레지스터의 존재에 대한 어떠한 흔적도 찾는 것이 불가능합니다.
2.스택. 일반 RAM(Random Access Memory) 영역에 상주합니다. 그러나 "스택 포인터"를 통해 처리에 대한 직접적인 지원이 가능합니다. 스택 포인터를 아래로 이동하면 새 메모리가 생성되고 위로 이동하면 해당 메모리가 해제됩니다. 이는 레지스터 다음으로 데이터를 저장하는 특히 빠르고 효율적인 방법입니다. 프로그램을 작성할 때 Java 컴파일러는 스택에 저장된 모든 데이터의 "길이"와 "존재 시간"을 정확히 알아야 합니다. 이는 포인터를 위아래로 이동하려면 적절한 코드를 생성해야 하기 때문입니다. 이러한 제한은 의심할 바 없이 프로그램의 유연성에 영향을 미치므로 일부 Java 데이터(특히 객체 핸들)가 스택에 저장되더라도 Java 객체는 스택에 배치되지 않습니다.
3.힙. Java 객체가 저장되는 범용 메모리 풀(RAM 영역이기도 함)입니다. 스택과 달리: "메모리 힙" 또는 "힙"의 가장 매력적인 점은 컴파일러가 힙에서 할당할 저장 공간의 양이나 저장된 데이터가 힙에 유지되는 기간을 알 필요가 없다는 것입니다. 따라서 힙을 사용하여 데이터를 저장할 때 더 큰 유연성을 얻을 수 있습니다. 객체를 생성해야 하는 경우 새 명령을 사용하여 해당 코드를 컴파일하기만 하면 됩니다. 이 코드가 실행되면 데이터가 자동으로 힙에 저장됩니다. 물론 이러한 유연성을 달성하려면 특정 비용을 지불해야 합니다. 힙에 저장 공간을 할당하는 데 시간이 더 오래 걸립니다
4. 정적 저장. 여기서 "정적"이란 "고정된 위치에 위치함"을 의미합니다. 프로그램이 실행되는 동안 정적으로 저장된 데이터는 언제든지 호출을 기다리고 있습니다. static 키워드를 사용하여 개체의 특정 요소가 정적임을 나타낼 수 있습니다. 그러나 Java 객체 자체는 결코 정적 저장 공간에 배치되지 않습니다.
5. 지속적인 보관. 상수 값은 일반적으로 프로그램 코드 내에 직접 배치됩니다. 그렇게 하는 것이 안전합니다. 일부 상수는 절대 변경되지 않으므로 엄격하게 보호해야 하므로 읽기 전용 메모리(ROM)에 배치하는 것이 좋습니다.
6. RAM이 아닌 저장소. 데이터가 프로그램과 완전히 독립적인 경우 프로그램이 실행되지 않고 프로그램의 제어 범위를 벗어나는 동안에도 존재할 수 있습니다. 가장 중요한 두 가지 예는 "스트리밍 개체"와 "고정 개체"입니다. 스트리밍 객체를 사용하면 객체가 바이트 스트림으로 변환되어 일반적으로 다른 시스템으로 전송되는 반면, 고정 객체를 사용하면 객체가 디스크에 저장됩니다. 프로그램이 종료되더라도 상태를 유지할 수 있습니다. 이러한 유형의 데이터 저장에 특히 유용한 요령은 해당 데이터가 다른 미디어에 존재할 수 있고 필요한 경우 일반 RAM 기반 개체로 복원될 수도 있다는 것입니다.


우선 Java에는 정적 변수라는 개념이 없습니다. 믿을 수 없다면 static int i = 0 으로 정의하면 됩니다. 메소드; Java에는 정적 멤버 변수만 있습니다. 클래스의 속성입니다. 그가 그것을 어디에 두었는지요? 제가 위층에서 말하는 것은 정적 영역입니다. 그런 번역이 있는지는 모르겠습니다. 그러나 jvm에 깊이 들어가면 메소드 영역으로 변환됩니다. 가상 머신의 아키텍처: 힙, 메소드 영역, 로컬 메소드 스택, PC 레지스터. 메소드 영역은 클래스의 템플릿을 저장하고 힙은 클래스의 인스턴스를 보유합니다. 스택은 일반적으로 함수 계산에 사용됩니다. 컴퓨터의 기초에 관한 책을 찾아보면 알 수 있습니다. 함수가 실행된 후에는 스택의 데이터가 저장되지 않습니다. 그렇기 때문에 지역 변수는 매번 동일합니다. 하나를 추가하더라도 다음에 해당 기능을 실행할 때에도 여전히 동일합니다.



원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!