메모리 릭에 대해서
인터넷에 끄적끄적 대어 알아낸 결과에 대해 간단히 적어본다.
이거 몰라서 차장님한테 욕먹음 ㅠㅠ;
[1] 메모리릭 이란 ? (정의를 알아야 뭐든안다)
- 우선 말로 설명 하면 메모리 릭이란 한글로 메모리 "누수" 이다.
누수란것은 어디론가 흘러간다는 뜻!!!! 일반적으로 개발자가 프로그램 작업시에 어떠한 객체 또는 변수에
특정 메모리를 참조할수 있도록 할당한 다음에 해당 변수에대한 참조를 해지 핮지않고 프로그램을 종료한다.
프로그램이 종료후에도 변수에 참조된 값은 해제가 되지 않거나, 참조 주소가 바뀌어서 영원히 해제가 되지
않을때 생기는 문제이다.
즉, 쉽게 말해서 gc가 처리해야할 대상에서 제외되는 것들이 생기는 현상을 말한다.
말로하니깐 참 드럽게 어렵기도 하다.
대충 소스를 보자 (랑이의 수도코드)
================================ A_Test.java ========================================
public class A_Test {
public static void main(String[] args) {
A_Test a = new A_Test(); // 요기서 a를 메모리 할당한다. 객체에 heap메모리의 주소값 참조함.
B_Test b = new B_Test();
b.rang(a); // call by reference로 a를 넘겨준다.
a= null; // a에 참조된 객체값을 null로 하여 gc가 처리할수 있도록 해준다.
}
}
======================================================================================
================================ B_Test.java ========================================
public class B_Test {
private A_Test test = null;
public void rang(A_Test a){
test = a; // 내부에서 새로운 test라는 객체에 주소값을 복사해버린다.
}
}
======================================================================================
위 소스를 보면 대~~~충 이해는 간다. B_Test 클래스에서 멤버변수에 새로운 주소값을 복사해 버린후에
test라는 객체는 주소값을 없애지 않고 날려버린다. 즉!!!!
test 라는 객체는 이제 오갈때 없는 heap영역안의 낙동강 오리알이 되어버린 것이다.
이런 오리알 들이 많이많이 쌓이면 heap라는 강물이 꽉차버린다. 그럼 어찌 되겠는가?
삐용삐용 장애발생이 되는것이다.
휴~~~~~~ 손가락 무지아프네..
[2] gc는 왜 처리를 못하는가?
자바에서 이론적으로 가비지 컬렉터 요놈이 알아서 ... 저러한 것들을 처리한다고 책에서 많이들 봐왔을것이다.
그럼 왜 이놈은 저런놈을 처리못하고 릭 상태로 해버리는것일까?
우선적으로 gc가 호출되어 메모리를 날려버리지 않는 대상에는 어떤놈이 있는지알아보자
- Http Session에 넣는 데이터..(세션 타임아웃 또는 invilidate 씨 까지 제외됨)
- Static 변수
- 서블릿 또는 jsp의 멤버변수 ( WAS 기동 후 최초 호출 시 인스턴스 화 되어 WAS가 내려 갈 때 까지 사라지지 않음 )
요3개는 나도 퍼왔다 . 모르는거니 퍼오는수밖에 ㅋㅋㅋ
보통 gc는 메모리를 알아서 관리해 주는 놈이라고 이론적으로 알고 있다.
하지만 gc는 신이아니다 . 개발자가 변수하나 설정 잘못해도 gc는 절대절대.... 그 해당 메모리를 해제하지못한다.
그렇기 때문에 개발자가 gc를 좀 도와줘야한다. 예를들어
Test test = new Test();
.
.
.
test = null;
이렇게 프로그램 좀 다 끝났다싶으면 null로 gc가 찾아내기 쉽게 바꿔주는것이바람직한 코딩법인것이다.
휴~~ 너무 많이썼더니 손가락 터지겠음.
다음시간에는 현재 메모리를 얼마나 잡아먹고 있고 / 메모리릭 이 일어나는 부분을 찾아내는 방법에 대해
툴 / 코딩법 등에 대해서 정리해서 올려보도록 하자!!!
- ps : 요거요거 엄청 빡세네 -.
- 2009/11/15 신국의 화랑 성랑 랑이 씀 -
'Program > JAVA' 카테고리의 다른 글
JAVA - LINUX 명령어 실행하는 방법 (0) | 2010.02.06 |
---|---|
자바 메일 강의자료 Sendmail (0) | 2010.01.27 |
String Class 사용시 주의사항 (2) | 2010.01.21 |
자바 특별한 Exception (0) | 2010.01.11 |
Class File Version Check (0) | 2009.12.18 |