사람이 Java나 다른 프로그래밍 언어를 배우기 시작하면 힙과 스택에 대해 접하게 됩니다. 처음에는 명확하고 명확한 설명이 없기 때문에 많은 사람들이 힙이 무엇인지 궁금해하게 됩니다. 스택이란 무엇이며 힙과 스택의 차이점은 무엇입니까? 더 나쁜 점은 Java에 후입선출(Last In First Out) 순차 데이터 구조인 java.util.Stack이 있다는 것입니다. 이 경우 필연적으로 이전 질문에 대해 많은 사람들이 더 혼란스러워질 것입니다. 실제로 힙과 스택은 모두 메모리의 일부이고 서로 다른 기능을 갖고 있으며 프로그램은 이 영역에 메모리를 할당해야 합니다. 우리 모두 알고 있듯이 모든 Java 프로그램은 JVM 가상 머신 내에서 실행됩니다. 여기서 소개하는 것은 당연히 JVM(가상) 메모리의 힙과 스택입니다.
차이점
Java에서 힙과 스택의 차이점은 당연히 인터뷰에서 흔히 나오는 질문입니다. 구체적인 차이점은 다음과 같습니다.
모두가 자신의 임무를 수행합니다.
가장 큰 차이점은 스택 메모리가 지역 변수와 메서드 호출을 저장하는 데 사용된다는 것입니다.
힙 메모리는 Java에서 객체를 저장하는 데 사용됩니다. 멤버 변수, 지역 변수, 클래스 변수 등 이들이 가리키는 객체는 힙 메모리에 저장됩니다.
독점 또는 공유
스택 메모리는 단일 스레드에 속하며, 각 스레드는 스택 메모리를 가지며, 해당 스레드가 저장하는 변수는 해당 스레드에서만 볼 수 있습니다. 즉, 스택 메모리는 스레드의 전용 메모리로 이해될 수 있습니다.
힙 메모리의 개체는 모든 스레드에 표시됩니다. 힙 메모리의 개체는 모든 스레드에서 액세스할 수 있습니다.
예외 오류
메소드 호출 및 로컬 변수를 저장할 스택 메모리에 사용 가능한 공간이 없으면 JVM은 java.lang.StackOverFlowError를 발생시킵니다.
그리고 생성된 객체를 저장할 힙 메모리에 사용 가능한 공간이 없으면 JVM은 java.lang.OutOfMemoryError를 발생시킵니다.
공간 크기
스택 메모리는 힙 메모리보다 훨씬 작습니다. 재귀를 사용하면 스택이 빨리 채워집니다. 재귀가 시간 내에 중단되지 않으면 StackOverFlowError 문제가 발생할 가능성이 높습니다.
-Xss 옵션을 사용하여 스택 메모리 크기를 설정할 수 있습니다. -Xms 옵션은 힙의 시작 크기를 설정하고, -Xmx 옵션은 최대 힙 크기를 설정합니다.
이것이 Java의 힙과 스택의 차이점입니다. 이 문제를 잘 이해하면 개발 문제 해결, 힙 메모리 및 스택 메모리 사용량 분석, 성능 튜닝까지 도움이 될 수 있습니다.
기본값 보기(업데이트됨)
힙의 기본값을 보려면 다음 코드를 사용합니다. 여기서 InitialHeapSize는 초기 힙의 크기이고 MaxHeapSize는 힙의 최대값입니다.
다음과 같이 코드 코드를 복사합니다.
13:17 $ java -XX:+PrintFlagsFinal -version grep HeapSize |
uintx ErgoHeapSizeLimit = 0 {제품}
uintx HeapSizePerGCThread = 87241520 {제품}
uintx InitialHeapSize := 134217728 {제품}
uintx LargePageHeapSizeThreshold = 134217728 {제품}
uintx MaxHeapSize := 2147483648 {제품}
자바 버전 "1.8.0_25"
Java(TM) SE 런타임 환경(빌드 1.8.0_25-b17)
Java HotSpot(TM) 64비트 서버 VM(빌드 25.25-b02, 혼합 모드)
ThreadStackSize가 스택 메모리의 크기인 스택의 기본값을 확인합니다.
다음과 같이 코드 코드를 복사합니다.
13:21 $ java -XX:+PrintFlagsFinal -version grep ThreadStackSize |
intx CompilerThreadStackSize = 0 {pd 제품}
intx ThreadStackSize = 1024 {pd 제품}
intx VMThreadStackSize = 1024 {pd 제품}
자바 버전 "1.8.0_25"
Java(TM) SE 런타임 환경(빌드 1.8.0_25-b17)
Java HotSpot(TM) 64비트 서버 VM(빌드 25.25-b02, 혼합 모드)
번역정보
영어 원문: http://javarevisited.blogspot.com.au/2013/01/difference-between-stack-and-heap-java.html.
번역은 원문을 기준으로 수정, 정리, 삭제되었습니다. 관심이 있으신 분은 원문을 확인하실 수 있습니다. PS 주소가 차단되었습니다.