-
Stack / Heap / Garbage CollectionJAVA 2020. 11. 18. 15:44
Stack
- Heap 영역에 생성된 Object ( Integer, String, ArrayList 등등 )에 대한 데이터의 참조값 저장
- 각 Thread는 자신만의 Stack을 가진다.
- Primitive Type의 데이터가 값과 함께 할당됨 (byte, short, int, long, double, float, boolean, char)
( boolean a = false; 가 stack에 저장될 시 stack에 a heap에 false가 저장되는 것이 아닌 stack에 a = false으로 저장됨 )
Heap
- Application 메모리중 stack에 있는 데이터를 제외한 데이터
(String a = " hello"가 존재할 경우 stack 에는 a 가 쌓여있고, heap에는 a = " hello"가 쌓임. )
- Heap 영역에 있는 오브젝트들을 가리키는 레퍼런스 변수가 stack 에 올라가게 된다.
- Stack은 Thread별로 된다면, Heap은 단 1개영역만 존재
public class CodeTest { @Test public void startMethod(){ String stringValue = "start game"; int intValue = 12; System.out.println("start string value = " + stringValue); System.out.println("start int value = " + intValue); compareValueMethod(stringValue,intValue); System.out.println("end string value = " + stringValue); System.out.println("end int value = " + intValue); } public static void compareValueMethod(String stringValueCompare , int intValueCompare){ stringValueCompare +=" end game? "; intValueCompare += 38; } }
순차대로 쌓이게 된 순서대로 나열하면.
[startMethod() Stack]
intValue = 12
stringValue
[compareValueMethod() Stack]
intValue = 38
stringValue
[Heap]
String "start game" ( startMethod() Stack stringValue 참조 )
#String "start game end game?" ( compareValueMethod() Stack stringValue 참조)
-> compareValueMethod() 가 종료되는 순간 compareValueMethod() Stack stringValue가 pop처리되기 때문에 어떤것도 레퍼런스 하지 않는 객체가됨
최종 output print
start string value = start game start int value = 12 end string value = start game end int value = 12
위와 같이 나오게 됩니다.
또한 Heap에 남아있는 String "start game end game?" ( compareValueMethod() Stack stringValue 참조) 는 참조하는 곳이 없기 때문에 Unreachable Object로 구분되게 되며, 이는 JVM의 GarbageCollector에 의하여 제거 되게 되는데,
JVM의 GarbageCollector는 Unreachable Object를 우선적으로 메모리에서 제거하는 역할군을 가지고 있는데,
Heap 내에 String "start game end game?" ( compareValueMethod() Stack stringValue 참조) 에서 compareValueMethod() Stack이 pop되는 순간 stack에서 참조하고 있던 stringValue를 잃어버리게 되면 Heap에 레퍼런스 참조할 start game end game이 쌓여있게 되는데
GarbageCollector가 이를 "marking" 작업을 통하여 제거 한다. ( Mark는 레퍼런스 참조가 없는 Heap에 쌓여있는 데이터를 제거 하는 작업을 말한다. )
Sweep은 Marking 작업이 되지 않는 모든 오브젝트를 heap에서 제거하는것을 말한다.
'JAVA' 카테고리의 다른 글
Try-with-resources (0) 2021.04.08 2개의 DB간 Table & Column 차이 비교 (0) 2021.03.12 Mybatis null check java method로 처리하기 (0) 2020.08.25 각각 DB 폴더에 담긴 Mapper 비교하여 누락된 내역 찾기 (0) 2020.01.22 Excel Sheet Copy (0) 2019.06.05