Java

[Java] Garbage Collection - gc정리와 관련 링크

bemaru 2014. 8. 3. 17:53
반응형

##가바지 컬렉션 참고링크##

더보기

http://dreamzelkova.tistory.com/652

-GC에 대한 간단한 개념정리

 

http://helloworld.naver.com/helloworld/1329

-가비지 컬렉션 과정과 구조

-가바지 컬렉션 포스트 중에 가장 마음에 드는 글이다

-문두에서 GC의 중요성을 강조해주신다

-GC를 잘 알 수록 실력있는 개발자?좋은개발자?

-구조와 과정에 대한, 그림을 동반한 간단명료한 설명이 좋다

 

http://www.slideshare.net/gmind7/about-garbage-collection

-윗 글 슬라이드 버젼

 

http://helloworld.naver.com/helloworld/329631

-Java Reference와 GC

 

http://darksilber.tistory.com/entry/Java-Reference-Object%EC%9D%98-%EC%9D%B4%ED%95%B4%EC%99%80-%ED%99%9C%EC%9A%A9strongweak-reference

-Reachablility 아직 잘 감이 안온다면

 

http://www.simpleisbest.net/post/2011/04/13/Weak-Reference-Intro.aspx

-근데 WeakReference가 뭐지? 라면

 

http://tuning-java.com/455

-perm에서 gc가 일어나는가?

 

 

##<프로그래밍 면접 이렇게 준비한다. 3판> 중에서 gc에 대한 내용을 정리해봤습니다.##

(개인적으로 GC과정과 구조에 대한 설명이 더 도움이 되는 듯합니다)

 

더보기

가비지컬렉션이란?

-프로그램에서 더 이상 쓰지 앟는 메모리를 자동으로 찾아서 가져가는 것

-가바지 컬렉션 기능을 갖춘 대표적인 언어 : c#, java, Lisp, python

 

장점

-직접메모리를 비워야 하는 경우에 비해 몇가지 장점이 있다.

-허상포인터(dangling pointer) , 다중할당해제(deallocation), 메모리누수에 의한 버그를 없앨 수 있다.

-메모리 할당 해제에 신경을 안써도됨(개발속도가 빨라짐)

 

단점

-더 이상 필요하지 않는 메모리를 언제 되찾아올지 결정하기 위한 오버헤드 때문에 대체로 더 느리다.

-시스템에서 메모리를 너무 많이 할당하고 최선의 시점에서 메모리를 비우지 못할 수 도 있다.

 

레퍼런스 카운팅

-한 객체를 참조하는 변수의 수를 추적하는 방법

-레퍼런스 카운트가 0이 되면 그 객체와 연관된 메모리가 비워진다.(필요 없으니까)

-간단하고 비교적 빠르다.

-but 단순하게 구현한 경우에는 원형 레퍼런스를 제대로 처리 못한다.

-원형 연결리스트가 있는데, 외부에서는 아무것도 그 리스트를 참조하지 않는다면,

리스트에 있는 모든 원소의 레퍼런스 카운트는 0이 아니지만, 리스트 자체를 제외하면 외부에서 그 리스트가 차지하고 있는

메모리를 참조한느 레퍼런스는 하.나.도. 없다. 하지만 단순한 레퍼런스 기반 가비지 컬렉터에서는 그런 메모리를 비우지 못한다.

 

약한 레퍼런스(weak reference)

-객체의 레퍼런스 카운트에 포함되지 않는 레퍼런스를 이용하면 문제해결가능하다.

-어떤 자료구조에 들어 있는 모든 레퍼런스의 사이클에 weak reference가 들어 있다면,

마지막 외부 레퍼런스가 없어진 뒤에 그 구조를 없애버리면 된다.

이중 연결 리스트의 예를 생각해보면, 단순한 레퍼런스 카운팅 체계에서는 모든 이웃 원소쌍이 서로 싸이클을 이루기 때문에

더 이상 외부에서 참조하지 않는 상황이 되더라도 그 메모리는 비워지지 않는다.

모든 "이전" 레퍼런스를 약한 레퍼런스로 정의하면 그 리스트에 대한 외부 레퍼런스가 전부 없어지면 head 원소의 레퍼런스 카운트가 0이 되어 할당이 해제된다. 그리고 나면 각 원소가 할당해제되고 나면 다음 원소의 레퍼런스 카운트가 0이 되므로 리스트를 따라 줄줄이 모든 원소가 할당해제 된다. 최근 버전의 C++에서는 std::shared_ptr와 std::weak_ptr로 이런 스타일의 가비지 컬렉션을 도입했다. (c++이 기본적으로 gc가 없지만, gc가 적용된 라이브러리는 제공하고 있다는 것인가? )

 

추적형 가비지 컬렉터

-gc 사이클 도중에 더 이상 참조되지 않는 메모리를 찾아내 할당해제 전까지는 그대로 둔다??

-원형 참조된 자료구조도 잘 처리됨

-레퍼런스 카운트에 대한 증감같은 오버헤드는 없다

-구현하는 가장 단순한 방법은 표시 후 삭제(mark and sweep)

더보기

=> 약한 레퍼런스를 줘서 메모리를 해제 한다는 늬앙스는 알겠는데, 글로만 보니까 약한 레퍼런스가 정확히 감이 안오는데

http://www.simpleisbest.net/post/2011/04/13/Weak-Reference-Intro.aspx <-참고하니까 감이 오네요.

구글링을 해보면 약한 레퍼런스가 기법인지, 객체들 사이에서 그런 reference가 존재하는지 헷갈리는데(이건 예전에 servlet에 대해 처음 들었을 때도 그랬는데, class로 존재하는 기법? 아무튼 servlet은 class였고 그 이름이 그것을 사용하는 기법을 대신 할 때도 있는 거였죠, )

 

아마 사용자가 일반적인 코딩을 하면서 strong reference만 발생하는 것 같습니다. new연산자를 이용해서 객체가 생성되는 일반적인 레퍼런스요. 하지만 weak reference를 만들 수 있습니다. 클래스가 있습니다. 사용하면 되죠.

 사실 이 부분(gc와 reference 전체에 대한)이 아직 공부가 제대로 안되서 확신을 갖고 설명은 못하겠지만

개인적으로 지금까지 이해한데로 설명을 하자면 이렇습니다.

 

여튼 요약하자면,

weak reference를 사용해서(class가 있음) 불필요한 메모리할당을 해제 할 수 있다. 입니다.

 

그 얘기는 개발자가 reference 정도를 조정해서 gc에 참여 할 수 있다는 거겠죠.

다시 말하자면 rechability에 대한 조정이 가능하다 입니다.

 

http://helloworld.naver.com/helloworld/329631에서 보면

앞에서 설명한 것처럼, 원래 GC 대상 여부는 reachable인가 unreachable인가로만 구분하였고 이를 사용자 코드에서는 관여할 수 없었다. 그러나 java.lang.ref 패키지를 이용하여 reachable 객체들을 strongly reachable, softly reachable, weakly reachable, phantomly reachable로 더 자세히 구별하여 GC 때의 동작을 다르게 지정할 수 있게 되었다. 다시 말해, GC 대상 여부를 판별하는 부분에 사용자 코드가 개입할 수 있게 되었다.

라고 되있습니다.

 

 

##요약##

 

-GC란 무엇인가? 짧게 정의하기

-GC는 사용자가 구현하지 않는다. 하지만 GC대상 선정에 관여 할 수있다.

-reachabililty, referce, referent는 무엇인가?

-GC가 지원되는 언어는? 지원되지 않는 언어는?

-GC의 구조와 과정 간단하게 알고 있기

-GC의 종류에는 여러가지가 있다. (다양한 GC 알고리즘이 존재한다)

-GC의 장단점

 

##결론##

 

##요약## 에 대해 간단히 알고, (깊이 들어 갈 수록 내용이 어렵고 방대해서 어느 정도까지만 알고 있는게 좋을듯)

특히 3가지로 줄이자면,

1) GC의 정의 2)GC의 구조와 과정 3) GC의 장단점

에 대해 개념적으로 알고 있는게 중요할 것 같다.

 

gc를 몰라도 java는 할 수 있다. 하지만 gc에 대해 전혀 모른다면, java개발자로서 반성해야 한다.

생각보다 기본적인 내용부터해서 잘 정리된 곳이 별로 없다.

gc에 대해 모르는 java사용자도 많은 것 같고.

일단 간단하게 gc에 개념부터 차근차근 알아가는게 좋은 것같다.

 

http://www.slideshare.net/gmind7/about-garbage-collection<-개념 정리에 좋은 듯

 

자료르 보다보니 -xx:+SerialGC이런게 나온다 그냥 GC이름인줄 알았는데

이게 뭔가 했더니 java command line option이였다

자세한 내용은 >>http://wiki.ex-em.com/index.php/JVM_Options

 

java command도 필요한 건 공부좀 해야 할 듯 하다

 

 

끝!

 

반응형