IT기술/CS(ComputerScience)
[CS] OOM의 원인과 아주 간단하게 OOM 발생 시키기
by 미노드
2023. 8. 3.
outofmemory가 나는 이유
- 설정된 메모리 대비 요청되는 메모리가 많기 때문에 나타나는 JVM에서 발생하는 에러
- 설정의 오류나 사용량 초과로 인해
- jdk 5 같은 경우는 jdk hotspot 버그로 인해 oom이 났던 경우도 있었음
oom 예시
- Application의 oom(순간적)
- 과도한 데이터 조회(100만건 200만건씩 조회해서 메모리 들고 있는 경우, 업로드 파일을 후처리 하기로 해서 메모리에 들고 있는 경우)
- 잘못된 데이터 조작(string)
- 장시간에 걸쳐서 서서히 메모리가 장식되는 경우(memory leak)
- Cache(어떤 데이터를 여러 쓰레드가 공유해서 사용하는 경우) leak
- Pool(배타적으로 사용할 때) leak (oom 가기 이전에 풀 부족으로 2차 장애가 발생하는 경우도 많음)
oom이 나게하려면??
- 데이터를 과도하게 조회해서 들고 있기
- 간단하게 arrayList에 1kb짜리 25만개 add 하거나 (실제 코드로 짰을 때 나는 1kb로 안되서 1000kb로 25만개 돌렸더니 4085번에서 즈음 oom 나긴함)
public static void main(String args[]) {
ArrayList list = new ArrayList();
try {
for(int i=0; i < 250000; i++) {
list.add(new byte[1000000]);
System.out.println(i);
Thread.sleep(1);
}
} catch (Exception e) {
e.printStackTrace();
}
}
원인 분석 및 해결 방법
- 단기적 해결 간단하게는 재기동..
- heap dump 분석 -> Eclipse의 Memory Analyzer 사용
- 부하 테스트 및 모니터링