221130 TIL

이지섭·2022년 11월 30일

1. 오늘 한 것

  • 자바 심화 강의
  • GC 정리

https://velog.io/@jsj3282/17.-도대체-GC는-언제-발생할까

  • Managed language : GC 기능을 지원하는 언어들
    • Java, Python
  • Unmanaged language : GC 기능이 없는 언어들
    • C, C++
    • 포인터 객체 a를 생성하고, malloc(size) 함수로 Heap 메모리를 직접 할당하여 사용 후, 다시 free(a)로 직접 반환
  • Memory leak? (메모리 누수)
    • Heap 영역에 할당만 되고 사용하지 않는 요소가 점점 쌓이는 현상
      • 메모리가 가득 차게되어 프로그램이 뻗게 됨
  • Garage Collector?
    • 사용하지 않는 요소(Garbage)를 자동적으로 추적하고, free() 시켜주는 작업
    • 언어와 동작하는 환경마다 방식이 다르다
  • GC 동작 방식
    [10분 테코톡] 🐥엘리의 GC
    • mark and sweep

      저장공간을 쓱 훑으면서 현재 사용중인 공간들은 마크하고
      마크 안된것들 반환

    • rechable, unreachable

      reference counting 참조 카운팅

      요소마다의 참조 횟수를 세어서

      참조가 0인 요소는 반환

    • 예전 자바는 프로그램 멈추고 GC 돌고 그래서 몇초씩 멈추고 그랬음

      • Stop-the-world
    • 요즘 자바는 프로그램 작동에 지장 없도록 멀티쓰레드로 작동

    • 그럼에도… 한계

      지워야 할 것들을 100퍼센트 잡아내진 못한다
      즉 그럼에도 memory leak은 결국 어디선가 일어난다…

      그래서 애초에 Memory leak이 일어나지 않도록 코드를 짜는 습관을 만들어야 한다

      어떤 memory leak 방지 방식이
      여기서는 효과적이지만
      저기서는 성능만 저하시키는 방식일 수도…

      각자가 사용하는 언어나 플랫폼, 기기마다 가장 최적화된 메모리 관리 방식을 알아둘 필요가 있다.

      가장 보편적인 팁

      순환참조 하지 말 것

      변수들이 서로를 참조한다면 레퍼런스 카운팅이 0이 되지 않는다.

      무한루프

      public class Chicken {
          @Autowired
          Egg egg;
      
          public void layEgg(){
              egg.becomeChicken();
          }
      }
      
      public class Egg {
          @Autowired
          Chicken chicken;
      
          public void becomeChicken() {
              chicken.layEgg();
          }
      }
      
      public CommandLineRunner run(Chicken chicken, Egg egg) throws Exception {
          return (String[] args) -> {
              chicken.layEgg(); // 실행
          };
      }
      
      // GC에 잡히지 않는 문제도 있지만
      // 애초에 이런 방식이면 Stack이 점점 쌓이다가 StackOverflow하여 프로그램 터짐
    • 메모리 누수를 잡으려면

2. 취침 전 목표

  • 바로 자자

3. 내일 할 것

  • 자바 심화 강의
  • 자바 심화 강의 스터디
  • 호텔 예약 프로그램 작성
  • 웹개발 종합반 마무리

4. 느낀점

  • call by value, call by reference 개념을 팀원들에게 알려주면서 나도 다시한번 정리하게 되어 좋았다.
  • 경쟁자는 벌써 저만치 앞에 가있다. 열심히 해야겠다..

5. 메모

  • LISP : 함수형 프로그래밍 익히기 딱
profile
Stop thinking. Just do it.

0개의 댓글