10주차 @jubin - GANGNAM-JAVA/JAVA-STUDY GitHub Wiki
가바지 컬렉션으로 런 아웃 메모리
-
JVM 에서 GC
-
heap 영역에 있는 Unreachable Object 를 제거한다.
- Unreachable object: stack이 할당하고 있지 않은 데이터들 ( ex: String https:// )
- Unreachable object: stack이 할당하고 있지 않은 데이터들 ( ex: String https:// )
-
Mark and Sweep
- Mark : Stack의 모든 변수들을 스캔하며 어떤 오브젝트를 레퍼런스 하고 있는지 찾음
- 모든 스레드 중단 ( stop the world ) → System.gc()를 주의해서 써야되는 이유.
- Sweep : unmark된 오브젝트를 힙에서 삭제
- Mark : Stack의 모든 변수들을 스캔하며 어떤 오브젝트를 레퍼런스 하고 있는지 찾음
GC 프로세스
- major GC : old generation
- minor GC : young generation
- FullGC : heap 전체 clear
-
-
새로운 오브젝트는 Eden 영역에 할당된다. 두개의 Survivor Space 는 비워진 상태로 시작한다.
-
Eden 영역이 가득차면, MinorGC 가 발생한다.
-
MinorGC 가 발생하면, Reachable 오브젝트들은 S0 으로 옮겨진다. Unreachable 오브젝트들은 Eden 영역이 클리어 될때 함께 메모리에서 사라진다.
-
다음 MinorGC 가 발생할때, Eden 영역에는 3번과 같은 과정이 발생한다. Unreachable 오브젝트들은 지워지고, Reachable 오브젝트들은 Survivor Space 로 이동한다. 기존에 S0 에 있었던 Reachable 오브젝트들은 S1 으로 옮겨지는데, 이때, age 값이 증가되어 옮겨진다. 살아남은 모든 오브젝트들이 S1 으로 모두 옮겨지면, S0 와 Eden 은 클리어 된다.
Survivor Space 에서 Survivor Space 로의 이동은 이동할때마다 age 값이 증가한다.
-
다음 MinorGC 가 발생하면, 4번 과정이 반복되는데, S1 이 가득차 있었으므로 S1 에서 살아남은 오브젝트들은 S0 로 옮겨지면서 Eden 과 S1 은 클리어 된다. 이때에도, age 값이 증가되어 옮겨진다.
Survivor Space 에서 Survivor Space 로의 이동은 이동할때마다 age 값이 증가한다.
-
Young Generation 에서 계속해서 살아남으며 age 값이 증가하는 오브젝트들은 age 값이 특정값 이상이 되면 Old Generation 으로 옮겨지는데 이 단계를 Promotion 이라고 한다.
-
MinorGC 가 계속해서 반복되면, Promotion 작업도 꾸준히 발생하게 된다.
-
Promotion 작업이 계속해서 반복되면서 Old Generation 이 가득차게 되면 MajorGC 가 발생하게 된다.
참고: https://yaboong.github.io/java/2018/06/09/java-garbage-collection/
Extends 보다 composition을 사용해야 하는 이유
- extends : 상속
- 확실한 Is-A관계가 성립될 때
- composition:
- 객체를 private 필드로 둠
- 포워딩(fowarding) : 기존 클래스 함수를 그대로 호출함
상속이 위험한 경우 → 캡슐화 원칙을 깰 수 있다.
- 다른 패키지에 있을 때
- 확장을 목적으로 설계되지 않았을 때
참고:https://jinwoojeon.tistory.com/2
TDD란?
- Test driven design
- 테스트를 작성한 후 구현하는 방법론
- 장점
-
- 함수의 모듈화
-
- 테스트 커버리지가 높아져 버그를 사전에 예방할 수 있음
-
- 단점 ?
rdb, nosql 차이(nosql eventual consistency)
- RDB ( 관계형 데이터베이스 )
- structure가 명확함
- 수평 확장이 어려움
- NoSQL (비 관계형 데이터베이스 )
- structure가 명확하지 않음
- 컬럼 추가가 자유로움
- 수직 확장이 어려움
- update 보단 read가 많을 경우에 쓰임