selfstarter

Java 메모리 Stack, Heap 정리 본문

Server/Java

Java 메모리 Stack, Heap 정리

selfstarter 2020. 5. 14. 14:54

Java 메모리 Stack, Heap 정리

// 1
int sum = 0;
for (int i = 0; i < arr.length(); ++i) {
    int value = arr[i];
    sum += value;
}

// 2
int sum = 0;
int value = 0;
for (int i = 0; i < arr.length(); ++i) {
    value = arr[i];
    sum += value;
}

이곳을 참고하여 정리하였습니다

for문 안에 사용하는 변수는 for문 안에 선언하면 더 좋은 이유

2개의 소스코드의 차이는 value 선언이 for문 안인지, 밖인지 여부이다
결론적으로 두개의 소스는 메모리적으로 차이가 없다
value 변수가 for문 안에 선언되어있을 때 여러개의 다른 value변수가 생기므로 메모리 낭비라고 생각했는데 잘못된 생각이었다.
stack은 지역변수에 선언된 변수,상수를 의미한다.stack은 하나의 thread에 하나씩 배정되고, 다른 stack 메모리 영역을 침범할 수 없다. heap은 stack을 제외한 부분으로 new로 동적할당 되는 데이터를 저장한다. 메모리상에서 사라질 때 까지 계속 사용된다.
value는 동적할당되지 않았으므로 stack에 쌓이고, for문의 괄호와 만나면 stack에서 pop된다. 생성, 해제가 없으므로 메모리 낭비가 없는 것이다.
객체도 마찬가지이다. 객체 변수를 for문 안에서 선언하든 밖에서 선언하든 100개 생성 시 둘 다 똑같이 100개의 데이터가 동적 할당이 된다.
그러므로 for문 안에서 변수를 계속 생성해도 메모리 상 차이가 없다.
또 지역변수는 사용하는 scope가 작아야 코드 분석이 쉽기 때문에 for문 안에 선언하는 방식이 더 선호된다.

Object형을 함수 인자로 전달하면 값을 변경할 수 있는 이유

함수에 기본데이터형을 인자로 전달할 경우 함수를 실행하는 새로운 thread가 생긴다.
함수를 호출한 scope와 호출한 함수의 scope는 전혀 다르므로 서로 다른 변수이고, 함수에서 전달인자를 변경해도 원본에 영향을 미치지 못한다.
Object형을 생성하면 new로 동적할당 하였기 때문에 heap에 메모리를 할당한다.
heap영역은 stack 영역처럼 scope를 벗어나면 없어지지 않는다. 그러므로 stack과 달리 heap영역에 데이터에 접근할 수 있다
heap에 함수를 호출한 scope, 호출한 함수의 scope 둘 다 접근할 수 있고, 값을 변경하면 수정된다
(Integer, Double, String 같은 Immutable Object는 좀 더 이해가 필요하다)

Comments