>  기사  >  Java  >  Java 메모리 관리 및 메모리 오버플로 예외에 대한 자세한 설명

Java 메모리 관리 및 메모리 오버플로 예외에 대한 자세한 설명

黄舟
黄舟원래의
2017-10-18 09:35:421652검색

아래 편집기에서는 Java 메모리 관리 및 메모리 오버플로 예외에 대해 간략하게 설명합니다. 편집자님이 꽤 좋다고 생각하셔서 지금 공유하고 모두에게 참고용으로 드리고자 합니다. 와서 에디터와 함께 살펴보세요

메모리 관리에 대해 말하면서, 저자는 Java와 C 및 C++의 차이점을 비교하고 싶습니다.

C와 C++에서 메모리 관리는 프로그래머의 책임입니다 즉, 프로그래머는 무거운 코드 작성 작업을 완료해야 하고 항상 시스템 메모리 유지 관리를 고려해야 합니다

Java에서는 프로그래머가 메모리 제어 및 유지 관리를 고려할 필요가 없고 JVM에 맡겨 자동으로 관리하므로 메모리 누수 및 오버플로 문제가 발생하기 쉽지 않습니다. 그러나 메모리 누수 및 오버플로 문제가 발생하면 JVM의 메모리 관리 메커니즘을 이해하지 못하면 오류를 찾기가 어렵습니다.

1. JVM 런타임 데이터 영역

Java 프로그램을 실행할 때 JVM은 관리하는 메모리를 여러 영역으로 나누어서 각각의 목적을 가지고 있을 뿐만 아니라 시간도 생성됩니다. . 일반적으로 여기에는 다음과 같은 런타임 데이터 영역이 포함됩니다.

주황색 영역은 각 스레드마다 전용입니다. 즉, 각 스레드는 자체 복사본을 갖고 녹색 영역은 각 스레드가 공유합니다.

2.Java 객체 생성

클래스 로딩 확인

JVM이 새 키워드를 스캔할 때 먼저 이 명령어의 매개변수가 상수 풀에 위치할 수 있는지 확인합니다. 클래스의 기호 참조. 이 클래스의 기호 참조가 나타내는 클래스가 로드, 확인 및 초기화되었는지 여부를 확인합니다. 그렇지 않은 경우 해당 클래스 로딩 과정을 먼저 수행해야 합니다.

메모리 할당

클래스 로딩 검사를 통과하면 JVM은 새 객체에 메모리를 할당해야 합니다. 이는 Java 힙에서 특정 크기의 메모리를 나누는 것을 의미합니다. 일반적으로 사용되는 두 가지 분할 방법은 포인터 충돌(힙 메모리가 절대적으로 규칙적이어야 함), 자유 목록(힙 메모리가 규칙적이지 않음)입니다.

메모리 초기화

JVM은 할당된 모든 메모리 공간을 0 값으로 초기화해야 합니다(객체 헤더 제외). 이렇게 하면 객체의 인스턴스 필드를 초기 값을 할당하지 않고 Java 코드에서 직접 사용할 수 있습니다. 즉, 프로그램은 이러한 필드의 데이터 유형에 해당하는 0 값에 액세스할 수 있습니다.

객체 초기화

프로그래머의 희망에 따라 메소드를 실행하여 객체를 초기화합니다.

3. 객체 액세스 위치

객체가 생성된 후에는 이러한 객체에 빠르게 액세스할 수 있기를 바랍니다. 이를 위해서는 현재 힙에서 특정 객체를 찾기 위해 JVM 스택의 참조 데이터가 필요합니다. 가장 일반적으로 사용되는 액세스 방법은 "handle method"과 "직접 포인터"입니다.

핸들 메소드를 사용하여 접근하는 경우 힙의 메모리 일부를 핸들 풀로 나누어야 합니다. 참조 변수는 객체의 핸들 주소를 저장하고 핸들에는 객체의 특정 주소 정보가 포함됩니다. 인스턴스 데이터 및 유형 데이터.

직접 포인터 액세스를 사용하는 경우 참조 변수에 저장되는 것은 바로 객체 주소이지만, 타입 데이터의 관련 정보를 어떻게 배치할지 고려해야 합니다.

4. 메모리 오버플로 예외

PC 레지스터 외에도 JVM 런타임 데이터 영역의 다른 메모리 영역에도 메모리 오버플로 예외가 있을 수 있습니다. PC 레지스터는 JVM 사양에서 OutOfMemoryError(OOM) 조건을 지정하지 않는 유일한 영역입니다.

Heap Overflow

Java의 힙은 객체 인스턴스를 저장하는 데 사용됩니다. 객체가 지속적으로 생성되고 GC 재활용을 피하기 위해 GC Roots와 객체 사이에 도달 가능한 경로가 있는 경우 객체 수가 최대에 도달합니다. 힙 용량이 제한되면 힙 오버플로 예외가 발생합니다.

스택 오버플로(JVM 스택 및 로컬 메서드 스택 포함)

1. 스레드에서 요청한 스택 깊이가 JVM에서 허용하는 최대 깊이보다 크면 StackOverflowError 예외가 발생합니다. JVM이 스택을 확장하는 경우 부족한 메모리 공간을 적용할 수 없으면 OutOfMemoryError 예외가 발생합니다.

그 외에도 메소드 영역 오버플로, 상수 풀 오버플로, 기본 메모리 오버플로 등이 있습니다.

위 내용은 Java 메모리 관리 및 메모리 오버플로 예외에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.