<메모리 분류>
Young Gen ( Eden , From, To)
Old Gen
Perm Gen : static Object, Constant String, Meta 가 저장되는데 GC가 되지 않는 영역이라서
메모리부족을 일으키는 요인 중 하나였는데, JDK1.8 에서는 제거되었다.. Meta->native로, static,String -> Heap으로 이동.
<GC> minor GC 하다가 모자라면 Old로 promotion 하고.. 그래도 부족하면 Major GC or Full GC를 하게된다.
1. minor GC (young GC) 가 할당된 survivor영역이 꽉차면 발생.
Young Gen에서 unReferrence된 Object들을 GC하면서
=> 비어있는 survivor영역으로 이동. (공간부족시 Old영역으로 이동)
from<->to 를 몇번(tenuringThreshold) 왔다갔다하면서도 살아남은 애들은 Old Gen 으로 옮긴다.
CMS:Concurrent Mark & Sweep
- Old GC (major GC) = parallel GC + CMS GC + G1 GC + (serial GC, parallel GC, parallel Comacting GC) REF
혹자는 Major GC=Full GC로 부르므로, 가능하면 Major GC란 용어는 사용하지 말자.
2. Magor GC: 1 이후 CMS GC 가 일어나는데..
CMS GC가 Old영역을 Compaction하지 않고 (즉, fragment를 해결하지 못하고) 따라서,
Full GC (전체 Heap clean) 를 유발: 즉, fragment가 많으면 Compaction(조각모음)도 수행한다. ---> 이 때, STW 발생. '
a. from, to 의 size를 늘이거나
b. tenuringThreshold를 늘여서 old로 잘 안보내거나,
c. CMS 의 동작을 좀 빨리하도록 해서 compaction이 덜 일어나게 하거나?? (XX:CMSInitiatingOccupancyFraction)
해서 해결한다.
참고: Major GC vs Full GC - Full GC 는 전체 Heap을 clean .. Ref
3. old 나 Perm영역이 부족하면 Full GC가 일어나고,
이 대, fragment가 많으면 Compaction(조각모음)도 수행한다. ---> 이 때, STW 발생.
혹자들(한국사이트들)은 old Generation이 꽉차면 이라고도 하는데.. 머 주로 compaction시 이것도 같이 발생할 것으로 보인다.
java 1.8 에서 permGen이 없어진 대신 metaSpace라는게 생겼다.
metaSpace는 클래스Loader가 로드한 클래스들의 metaData과 관리되는 곳.
기존의 permGen은 Heap에서 관리했으나, metaSpace는 native memory영역에서 관리함.
==> 그러므로 application이 STW할 확률은 낮아졌으나, OS전체 메모리가 부족할 수도 있으므로 --XXMetaSpace등으로 사이즈 조절필요. 참고: REF