<출처 - https://dzone.com/articles/java-memory-management >
타입이름 | 종류 |
---|---|
정수타입 | byte , char , short , int |
실수타입 | float , double |
논리타입 | boolean |
public class Main {
public static void main(String[] args) {
int num = 1;
num = setStack(num);
}
public static int setStack(int number){
int element = number * 3;
return ele;
}
}
위의 코드를 예시로들었을때 메모리가 어떻게 관리되는지확인해보겠다.
- 먼저 num에 1이 할당된다.
- 다음으로 setStack() 메서드가 호출이 되고 argument로 num을 넘겨준다. 이때 스코프가 바뀌면서 기존에 main에 stack에 들어간 num은 더이상 사용할 수 없게된다. 그리고 바뀐 스코프에 따라 아래그림과 같이 Stack에 누적된다.
- 다음으로 setStack메서드안의 연산이 적용된다.
- 마지막으로 }로 setStack의 괄호가 닫히면서 기존에 적용된 지역변수들은 모두 POP되고 함수를 호출했던 시점으로 돌아가서 아래와 같은 상태가 된다.
마지막에 num에 1이할당되어 있지만 3이 재할당 되면서 위와같은 상태가 되는거다.
그리고 마지막으로 main의 메서드도 }를 만나면 안에 데이터들은 모두 POP되고 비어있는 Stack상태로 프로그램이 종료된다.
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("one");
list.add("two"); // ====> 1번 상태
String result = sub(list)
System.out.println(list); // ====> 3번 상태
}
public static String sub(List<String> mainList) {
String element = mainList.get(0);
mainList.add("three");
return element; // ====> 2번 상태
}
위의 코드를 보면서 메모리가 어떻게 관리되는지 확인해보겠다.
1번상태)
위의 그림과 같이 list라는 stack에 Heap에 있는 List의 값의 위치가 할당되는구조이다.2번상태)
위의 Stack에 설명한대로 Scope의 변경에따라 list변수에는 접근이 불가한 상태이다.
하지만 argument로 list를 받아와 같은 위치에 있는 List에 접근이 가능한것이다.
3번상태)
만약 3번상태인 System.out.println(list)에 결과값은 어떻게 될까?
같은 곳의 List를 수정했으니 안에값은 그대로 있을거다라고 생각하겠지만 틀렸다.
Scope가 변화됨과 동시에 할당된 "three"의 값도 pop으로 없어지게 되는것이다.
결과적으로 다음과 같은 값이 나타나게 되는것이다.
TIP) Static area(스태틱 메모리 영역)
- JAVA는 크게 필드, 생성자, 메소드로 구성이 된다. 그중 필드 부분에서 선언된 변수는 정적변수와 멤버변수로 나뉘게 되는데 이때 Static이 붙는게 정적 변수이다.
- 이때 Static은 프로그램이 시작부터 종료까지 쭉 메모리에 남아있게 되는것이고 나쁘게 말하면 무분별한 사용시 메모리를 빠르게 잡아먹지만
- 이를 감안하고 사용만 잘한다면 지속적으로 사용되는 데이터를 static으로 두어 유용하게 사용할 수 있는것이다.
참고
- https://postitforhooney.tistory.com/entry/JavaStackHeap-JAVA%EC%9D%98-Stack%EA%B3%BC-Heap%EC%9D%98-%EC%9D%B4%ED%95%B4%EB%A5%BC-%ED%86%B5%ED%95%B4-Java%EC%9D%98-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B4%80%EB%A6%AC
- https://yaboong.github.io/java/2018/05/26/java-memory-management/
- https://mangkyu.tistory.com/118
- https://www.holaxprogramming.com/2013/07/20/java-jvm-gc/