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 사용
- 부하 테스트 및 모니터링
- JMeter
- Visual VM
'IT기술 > CS(ComputerScience)' 카테고리의 다른 글
애자일 개발 프로세스 (0) | 2023.08.10 |
---|---|
소프트웨어 공학의 모든 것 - 유지보수 (0) | 2023.08.07 |
개발에서 빌드도구(Build tool) maven, gradle 살펴보기 (0) | 2023.04.18 |
온디맨드(On-Demand) 서비스 (0) | 2023.04.17 |
yaml 문법 (0) | 2023.04.17 |