based on: #227 by @yngbao97
성능 테스트를 주제로 몇 번의 글을 작성하며 메모리에 관한 테스트를 해본 적은 없었는데 좋은 인사이트를 얻을 수 있는 글이었습니다.
작성해주신 파트에서 기본 타입의 배열도 객체인데 메모리 사용량이 0인 것이 특이해서 추가로 테스트를 진행했으며 기존에 작성해주신 코드와 거의 동일한데 메모리 측정을 시작하는 beforeMemory 초기화 이후 배열을 초기화하는 것으로 코드를 수정했고 배열의 크기별로 테스트를 진행했습니다.
package item61;
public class MemoryTest {
public static void main(String[] args) {
measureMemoryUsage(10000);
measureMemoryUsage(20000);
measureMemoryUsage(30000);
measureMemoryUsage(40000);
measureMemoryUsage(50000);
measureMemoryUsage(100000);
measureMemoryUsage(200000);
}
private static void measureMemoryUsage(int size) {
Runtime runtime = Runtime.getRuntime();
long beforeMemory = runtime.totalMemory() - runtime.freeMemory();
long[] classic = new long[size];
for (int i = 0; i < classic.length; i++) classic[i] = i;
long afterMemory = runtime.totalMemory() - runtime.freeMemory();
System.out.println("size: " + size + ", 기본 타입(long) 메모리 사용량: " + (afterMemory - beforeMemory) + " bytes");
}
}
// 출력 결과
size: 10000, 기본 타입(long) 메모리 사용량: 0 bytes
size: 20000, 기본 타입(long) 메모리 사용량: 0 bytes
size: 30000, 기본 타입(long) 메모리 사용량: 240016 bytes
size: 40000, 기본 타입(long) 메모리 사용량: 320016 bytes
size: 50000, 기본 타입(long) 메모리 사용량: 400016 bytes
size: 100000, 기본 타입(long) 메모리 사용량: 1048576 bytes
size: 200000, 기본 타입(long) 메모리 사용량: 2097152 bytes
// 순서 바꿔서 출력
size: 100000, 기본 타입(long) 메모리 사용량: 1048576 bytes
size: 50000, 기본 타입(long) 메모리 사용량: 0 bytes
size: 10000, 기본 타입(long) 메모리 사용량: 524288 bytes
size: 200000, 기본 타입(long) 메모리 사용량: 2137016 bytes
size: 40000, 기본 타입(long) 메모리 사용량: 0 bytes
size: 20000, 기본 타입(long) 메모리 사용량: 160016 bytes
size: 30000, 기본 타입(long) 메모리 사용량: 240016 bytes
출력 결과는 다음과 같고 일반적으로 예상 가능한 출력은 long 타입 8byte * 배열 크기 + 배열 헤더 16byte로 계산되는 데이터였습니다.
일부 케이스에서 메모리 사용량이 0바이트로 측정되는 부분은 이해하기가 어려웠는데 JVM 메모리 관리 최적화 과정에서 일부 배열의 할당이 freeMemory와 totalMemory에 반영되지 않아서 생기는 이슈 혹은 JVM의 느린 할당 이슈로 메모리 사용량이 즉시 반영되지 않아서 생기는 이슈라는 정도의 답변만 받을 수 있었습니다.
일부 케이스에서 메모리 사용량이 크게 측정되는 것은 JVM의 메모리 최적화가 2의 거듭제곱 단위로 관리가 돼서 그렇다는 답변을 받을 수 있었습니다.(524288=2^19, 1048576=2^20, 2097152 =2^21)
based on: #227 by @yngbao97
성능 테스트를 주제로 몇 번의 글을 작성하며 메모리에 관한 테스트를 해본 적은 없었는데 좋은 인사이트를 얻을 수 있는 글이었습니다.
작성해주신 파트에서 기본 타입의 배열도 객체인데 메모리 사용량이 0인 것이 특이해서 추가로 테스트를 진행했으며 기존에 작성해주신 코드와 거의 동일한데 메모리 측정을 시작하는
beforeMemory초기화 이후 배열을 초기화하는 것으로 코드를 수정했고 배열의 크기별로 테스트를 진행했습니다.출력 결과는 다음과 같고 일반적으로 예상 가능한 출력은 long 타입 8byte * 배열 크기 + 배열 헤더 16byte로 계산되는 데이터였습니다.
일부 케이스에서 메모리 사용량이 0바이트로 측정되는 부분은 이해하기가 어려웠는데 JVM 메모리 관리 최적화 과정에서 일부 배열의 할당이 freeMemory와 totalMemory에 반영되지 않아서 생기는 이슈 혹은 JVM의 느린 할당 이슈로 메모리 사용량이 즉시 반영되지 않아서 생기는 이슈라는 정도의 답변만 받을 수 있었습니다.
일부 케이스에서 메모리 사용량이 크게 측정되는 것은 JVM의 메모리 최적화가 2의 거듭제곱 단위로 관리가 돼서 그렇다는 답변을 받을 수 있었습니다.(524288=2^19, 1048576=2^20, 2097152 =2^21)