자바에서는 메모리 관리 중요한 과정입니다. Java에 의해 자동으로 관리됩니다. JVM은 메모리를 두 부분으로 나눕니다. 스택 메모리와 힙 메모리. Java의 관점에서 볼 때 둘 다 중요한 메모리 영역이지만 둘 다 다른 목적으로 사용됩니다. 그만큼 스택 메모리와 힙 메모리의 주요 차이점 스택은 메소드 실행 순서와 로컬 변수를 저장하는 데 사용되고 힙 메모리는 객체를 저장하고 동적 메모리 할당 및 할당 해제를 사용한다는 것입니다. 이번 섹션에서는 스택과 힙의 차이점에 대해 자세히 설명합니다.
스택 메모리
스택 메모리는 런타임 시 각 스레드에 할당되는 물리적 공간(RAM 내)입니다. 스레드가 생성될 때 생성됩니다. 스택의 메모리 관리는 전역적으로 액세스할 수 있으므로 LIFO(Last-In-First-Out) 순서를 따릅니다. 변수, 개체에 대한 참조 및 부분 결과를 저장합니다. 스택에 할당된 메모리는 함수가 반환될 때까지 유지됩니다. 새 객체를 생성할 공간이 없으면java.lang.StackOverFlowError. 요소의 범위는 해당 스레드로 제한됩니다. 그만큼 JVM 각 스레드에 대해 별도의 스택을 생성합니다.
힙 메모리
JVM이 시작될 때 생성되고 애플리케이션이 실행되는 동안 애플리케이션에서 사용됩니다. 객체와 JRE 클래스를 저장합니다. 객체를 생성할 때마다 해당 객체의 참조가 스택에 생성되는 동안 객체는 힙 메모리의 공간을 차지합니다. 스택과 같은 순서를 따르지 않습니다. 메모리 블록을 동적으로 처리합니다. 즉, 메모리를 수동으로 처리할 필요가 없습니다. 메모리를 자동으로 관리하려면, 자바 더 이상 사용되지 않는 객체를 삭제하는 가비지 수집기를 제공합니다. 힙에 할당된 메모리는 프로그램이 종료되거나 메모리가 해제되는 이벤트가 발생하지 않을 때까지 유지됩니다. 해당 요소는 애플리케이션에서 전역적으로 액세스할 수 있습니다. 모든 스레드가 공유하는 공통 메모리 공간입니다. 힙 공간이 가득 차면java.lang.OutOfMemoryError. 힙 메모리는 다음과 같은 메모리 영역으로 더 세분화됩니다.
- 젊은 세대
- 생존자 공간
- 구세대
- 영구 세대
- 코드 캐시
다음 이미지는 스택 메모리 및 힙 공간 할당을 보여줍니다.
스택 메모리와 힙 메모리의 차이점
다음 표에는 스택 메모리와 힙 공간 간의 주요 차이점이 모두 요약되어 있습니다.
매개변수 | 스택 메모리 | 힙 공간 |
---|---|---|
애플리케이션 | 다음과 같이 수명이 매우 짧은 품목을 저장합니다. 메소드, 변수, 그리고 참조 변수 개체의. | 저장한다 사물 및 Java 런타임 환경( JRE ) 클래스. |
주문 | 그것은 다음과 같습니다 LIFO 주문하다. | 이는 동적 메모리 할당이고 메모리 블록의 할당 및 할당 해제에 대한 고정된 패턴이 없기 때문에 어떤 순서도 따르지 않습니다. |
유연성 | 그것은 융통성이 없다 할당된 메모리를 변경할 수 없기 때문입니다. | 그것은 유연한 할당된 메모리를 변경할 수 있기 때문입니다. |
능률 | 그것은 가지고있다 더 빠르게 액세스, 할당 및 할당 해제. | 그것은 가지고있다 더 느리게 액세스, 할당 및 할당 해제. |
메모리 크기 | 그것은 더 작은 크기가. | 그것은 더 큰 크기가. |
사용된 Java 옵션 | JVM 옵션 -Xss를 사용하여 스택 크기를 늘릴 수 있습니다. | -Xmx 및 -Xms JVM 옵션을 사용하여 힙 메모리 크기를 늘리거나 줄일 수 있습니다. |
가시성 또는 범위 | 변수는 소유자 스레드에만 표시됩니다. | 모든 스레드에 표시됩니다. |
공간의 생성 | 스레드가 생성되면 운영 체제가 자동으로 스택을 할당합니다. | 애플리케이션을 위한 힙 공간을 생성하기 위해 언어는 먼저 런타임에 운영 체제를 호출합니다. |
분포 | 각 개체에 대해 별도의 스택이 생성됩니다. | 모든 스레드에서 공유됩니다. |
예외 발생 | JVM은 java.lang.StackOverFlowError 스택 크기가 제한보다 큰 경우. 이 오류를 방지하려면 스택 크기를 늘리십시오. | JVM은 java.lang.OutOfMemoryError JVM이 새로운 기본 메소드를 생성할 수 없는 경우. |
할당/할당 해제 | 이는 자동으로 수행됩니다. 컴파일러 . | 이는 수동으로 수행됩니다. 프로그램 제작자 . |
비용 | 그 비용은 더 적은 . | 그 비용은 더 스택에 비해. |
구현 | 그 구현은 딱딱한 . | 그 구현은 쉬운 . |
할당 순서 | 메모리 할당은 마디 없는 . | 할당된 메모리 무작위의 주문하다. |
스레드 안전성 | 각 스레드에는 자체 스택이 있으므로 스레드로부터 안전합니다. | 스레드로부터 안전하지 않으므로 코드를 적절하게 동기화해야 합니다. |