10주차 @jubin - GANGNAM-JAVA/JAVA-STUDY GitHub Wiki

가바지 컬렉션으로 런 아웃 메모리

  • JVM 에서 GC

    • heap 영역에 있는 Unreachable Object 를 제거한다.

      • Unreachable object: stack이 할당하고 있지 않은 데이터들 ( ex: String https:// ) stackimage
    • Mark and Sweep

      • Mark : Stack의 모든 변수들을 스캔하며 어떤 오브젝트를 레퍼런스 하고 있는지 찾음
        • 모든 스레드 중단 ( stop the world ) → System.gc()를 주의해서 써야되는 이유.
      • Sweep : unmark된 오브젝트를 힙에서 삭제

    GC 프로세스

    • major GC : old generation
    • minor GC : young generation
    • FullGC : heap 전체 clear

gcimage

  1. 새로운 오브젝트는 Eden 영역에 할당된다. 두개의 Survivor Space 는 비워진 상태로 시작한다.

  2. Eden 영역이 가득차면, MinorGC 가 발생한다.

  3. MinorGC 가 발생하면, Reachable 오브젝트들은 S0 으로 옮겨진다. Unreachable 오브젝트들은 Eden 영역이 클리어 될때 함께 메모리에서 사라진다.

  4. 다음 MinorGC 가 발생할때, Eden 영역에는 3번과 같은 과정이 발생한다. Unreachable 오브젝트들은 지워지고, Reachable 오브젝트들은 Survivor Space 로 이동한다. 기존에 S0 에 있었던 Reachable 오브젝트들은 S1 으로 옮겨지는데, 이때, age 값이 증가되어 옮겨진다. 살아남은 모든 오브젝트들이 S1 으로 모두 옮겨지면, S0 와 Eden 은 클리어 된다.

    Survivor Space 에서 Survivor Space 로의 이동은 이동할때마다 age 값이 증가한다.

  5. 다음 MinorGC 가 발생하면, 4번 과정이 반복되는데, S1 이 가득차 있었으므로 S1 에서 살아남은 오브젝트들은 S0 로 옮겨지면서 Eden 과 S1 은 클리어 된다. 이때에도, age 값이 증가되어 옮겨진다.

    Survivor Space 에서 Survivor Space 로의 이동은 이동할때마다 age 값이 증가한다.

  6. Young Generation 에서 계속해서 살아남으며 age 값이 증가하는 오브젝트들은 age 값이 특정값 이상이 되면 Old Generation 으로 옮겨지는데 이 단계를 Promotion 이라고 한다.

  7. MinorGC 가 계속해서 반복되면, Promotion 작업도 꾸준히 발생하게 된다.

  8. Promotion 작업이 계속해서 반복되면서 Old Generation 이 가득차게 되면 MajorGC 가 발생하게 된다.

참고: https://yaboong.github.io/java/2018/06/09/java-garbage-collection/

Extends 보다 composition을 사용해야 하는 이유

  • extends : 상속
    • 확실한 Is-A관계가 성립될 때
  • composition:
    • 객체를 private 필드로 둠
    • 포워딩(fowarding) : 기존 클래스 함수를 그대로 호출함

상속이 위험한 경우 → 캡슐화 원칙을 깰 수 있다.

  1. 다른 패키지에 있을 때
  2. 확장을 목적으로 설계되지 않았을 때

참고:https://jinwoojeon.tistory.com/2

TDD란?

  • Test driven design
  • 테스트를 작성한 후 구현하는 방법론
  • 장점
      1. 함수의 모듈화
      1. 테스트 커버리지가 높아져 버그를 사전에 예방할 수 있음
  • 단점 ?

rdb, nosql 차이(nosql eventual consistency)

  • RDB ( 관계형 데이터베이스 )
    • structure가 명확함
    • 수평 확장이 어려움
  • NoSQL (비 관계형 데이터베이스 )
    • structure가 명확하지 않음
    • 컬럼 추가가 자유로움
    • 수직 확장이 어려움
    • update 보단 read가 많을 경우에 쓰임