본문 바로가기

JAVA/Coding Habit

[Story 02] 도대체 GC 는 언제 발생할까?


GC 란?

자바에서 메모리를 GC 라는 알고리즘을 통하여 관리하기 때문에,
개발자가 메모리를 처리하기 위한 로직을 만들 필요가 없고, 절대로 만들어서는 안된다.

Garbage Collection.
(자바에서는 쓰레기 객체)
하나의 객체는 메모리를 점유하고 필요하지 않으면 메모리에서 해제되어야 한다.

예를들어 아래는 a 라는 객체가 만들어져 메모리의 한 부분을 점유하게 된다.

String a = new String();

다음은 GC 발생의 예이다.
아래 부분은 makeQuery() 메소드를 호출한 후 수행이 완료 되면,
queryPre 객체와 queryPost 개체는 더이상 필요가 없는 객체, 즉 GC 가 된다.
(또한 다음과 같은 코드는 좋지 않은 코드 이다 ^^)

Public String makeQuery (String code) {
String queryPre = "Select * from 테이블명 where a ='";
String queryPost =" ' order by c ";
return queryPre + code + queryPost;
}



* GC 의 원리

GC 의 역할

1. 메모리 할당
2. 사용중인 메모리 인식
3. 사용하지 않는 메모리 인식


사용하지 않는 메모리를 인식하는 작업을 수행하지 않으면, 할당한 메모리 영역이 꽉 차서 WAS 에 행 (Hang) 이 걸리거나, 더 많은 메모리를 할당 하려는 현상이 발생할 것이다. 만약 WAS 의 최대 메모리 크기를 지정해서 전부 사용한 다음, GC 를 해도 더이상 사용 가능한 메모리 영역이 없는데 계속 메모리를 할당하려고 하면 OutOfMemoryError  가 발생하여 WAS 가 다운될 수도 있다.

GC 는 아무때나 하는 것이 아니라, 각 영역의 할당된 크기의 메모리가 허용치를 넘을 때 수행한다는 것과,
개발자가 컨트롤할 영역이 아니다.



* 강제로 GC 시키기

개발자가 컨트롤할 영역이 아님에도 불구하고 강제로 GC 는 발생 시킬수 있다.

1. System.gc() 메소드
2. Runtime.getRuntime().gc() 메소드


를 쓰면 된다.

GC 메소드를 쓰게 되면 약 5000배 이상의 성능차이가 발생한다.



한마디로 말해 GC 는 개발자 영역이 아니므로 신경 쓰지 않아도 된다!
GC 가 발생하지 않도록 코딩 하는것이 오히려 개발자가 해야 할 일인듯 ... 특히 뒤에 나올 String!!!!!!! 같은 경우! ^^