##가바지 컬렉션 참고링크##
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
-Reachablility 아직 잘 감이 안온다면
http://www.simpleisbest.net/post/2011/04/13/Weak-Reference-Intro.aspx
-근데 WeakReference가 뭐지? 라면
-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도 필요한 건 공부좀 해야 할 듯 하다
끝!
'Java' 카테고리의 다른 글
[Java] 이클립스에서 getter, setter 자동생성하기 (0) | 2017.04.19 |
---|---|
[이클립스:실행오류] Java was started but returned exit code=1 (0) | 2014.11.25 |
JAVA의 특징 (0) | 2014.11.04 |