현재 실행중인 Java application의 메모리 사용량을 확인해 볼 수 있다.
// JVM이 허용하는 최대 힙 메모리 크기, -Xmx
// long maxMem = Runtime.getRuntime().maxMemory()/1024/1024;
// 아래 내용(Runtime.getRuntime().maxMemory())을 보완하기위해 수정된 소스
long maxMem = 0L;
MemoryMXBean m = ManagementFactory.getMemoryMXBean();
for (MemoryPoolMXBean mp : ManagementFactory.getMemoryPoolMXBeans()) {
if(mp.getName().indexOf("Tenured") > -1){
maxMem += mp.getUsage().getMax();
} else if(mp.getName().indexOf("Eden") > -1){
maxMem += mp.getUsage().getMax();
} else if(mp.getName().indexOf("Survivor") > -1){
// 곱하기 2를 해야 함(s0 + s1)
maxMem += (mp.getUsage().getMax() * 2);
}
}
if(maxMem == 0){
// Runtime.getRuntime().maxMemory()와 -Xmx 값에는 약간의 차이가 발생
// GC 구조 eden + survivor(s0 + s1) + tenured + parmanent 인데
// xmx = eden + survivor(s0 + s1) + tenured(old gen)
// maxMemory = eden + survivor/2 + tenured(old gen) : survivor 2개 중 한개가 빠짐
maxMem = Runtime.getRuntime().maxMemory()/1024/1024;
}
// JVM이 현재 힙 메모리로 할당한 총 크기, -Xms (초기값) 및 힙 확장 상태
long totalMem = Runtime.getRuntime().totalMemory()/1024/1024;
// java vm이 추가로 할당 가능한 메모리
long freeMem = Runtime.getRuntime().freeMemory()/1024/1024;
// 현재 사용중인 메모리
long usedMem = totalMem - freeMem;
// 퍼센트
double pct = usedMem * 100 / maxMem;
String t = "heap.current \t heap.percent \t heap.max";
String s = String.format("%s\r\n%10dmb \t %11.1f%% \t %6dmb", t, usedMem, pct, maxMem);
System.out.println(s);
실행결과
그런데 실행한 결과를 보면 maxMemory가 -Xmx 지정한 사이즈보다 작은 값으로 표기된다.
JVM구조
maxMemory 는 GC 구조상 Eden + Survivor(s0 + s1)/2 + Old 로 계산되기 때문(survivor 2개중 한개만 계산에 포함)
아래의 링크를 참조: https://stackoverflow.com/questions/23701207/why-do-xmx-and-runtime-maxmemory-not-agree
출처:https://realkoy.tistory.com/entry/JAVA-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%82%AC%EC%9A%A9%EB%9F%89
즐겁게/anything
JAVA 메모리 사용량 확인
'프로그램 개발(분석, 설계, 코딩, 배포) > 2.2.1 java' 카테고리의 다른 글
[Java] 적절한 Heap사이즈 설정 (0) | 2025.07.02 |
---|---|
자바에서 사용 중인 메모리 체크 (1) | 2025.06.30 |
JVM이란? (0) | 2025.06.30 |
자바 힙 메모리(Java Heap Memory) 분석 내용 총정리 (0) | 2025.06.30 |
G1GC (Garbage-First Garbage Collector) 설정 (1) | 2025.06.26 |