22/10/29 TIL - Java OOP

김민우·2022년 10월 30일
0

TIL

목록 보기
7/10
  • IntelliJ 저장 시 자동 정렬
    - https://velog.io/@viiviii/intelliJ-trigger-actions-when-saving-changes

  • 인텔리제이 저장 시 자동 세미콜론 추가
    - 수동으로는 window에선 ctrl+shift+enter

  • this를 사용하는 이유
    - 객체 지향 프로그래밍 언어는 클래스라는 캡슐화를 통해 외부와 내부를 분리하기 때문에 필연적으로 인스턴스를 내부에서 사용하는 로직이 필요합니다.

  • getter/setter를 사용하는 이유
    - 객체의 무결성을 보장하기 위해 사용합니다. 예를 들어, 만약 외부에서 몸무게라는 필드에 직접 접근한다면 0보다 낮은 값을 줄 수도 있습니다. 이 경우 객체의 무결성이 깨지기 때문에 이를 방지하기 위해 Getter/Setter를 사용하여 데이터의 무결성을 지켜줍니다.
    - 참고 자료

  • 클래스 변수 vs 인스턴스 변수
    -
    - 참고 자료

  • 클래스 메소드
    - 만약 메소드가 인스턴스 변수를 참조하지 않는다면 클래스 메소드를 사용해서 불필요한 인스턴스의 생성을 막을 수 있다.

인스턴스 메소드는 클래스 멤버에 접근 할 수 있다. 그러나 클래스 메소드는 인스턴스 멤버에 접근할 수 없다.
- 인스턴스 변수는 인스턴스가 만들어지면서 생성되는데, 클래스 메소드는 인스턴스가 생성되기 전에 만들어지기 때문에 클래스 메소드가 인스턴스 멤버에 접근하는 것은 존재하지 않는 인스턴스 변수에 접근하는 것과 같다.

  • 유효범위 (Scope)
    - ...

  • 자바의 패키지?
    - 자바 패키지란 클래스들의 모음집으로, 패키지를 통해서 라이브러리 구분이 가능하다.
    - 패키지를 사용하는 이유는 클래스명의 고유성을 보장하기 위함이다.
    - 참고 자료

  • this
    - 참고 자료
    - this를 붙이는 이유 : 변수의 이름이 같을 때 , 전역변수 global varieble 과 지역변수local를 구분하기 위해서
    - this 가 붙어있는 것은 전역변수. 없는 것은 지역 변수.

  • 초기화(initialization)와 생성자(constructor)

자바의 객체는 힙 메모리 공간에 저장된다. 기존에 알고 있는 메모리 힙이 아닌 가비지 컬렉션 기능이 있는 힙이다.

자바의 모든 코드는 클래스 내에서 정의 된다.

  • 클래스가 수백, 수천 개 되는 파일을 어떻게 전달할까?
    - 한번에 많은 파일을 일일이 전달하려면 힘들다. 그러나, 자바는 자바 아카이브(.jar 파일) 하나에 넣을 수 있다. (.jar 파일은 pkzip 유형을 바탕으로 만들어진다.) jar 파일에는 manifest라고 부르는 간단하게 포매팅된 텍스트 파일이 들어가는데, 바로 그 파일에 jar에 들어있는 파일 중에서 어떤 파일을 실행시켜야 할지를 알려주는 내용이 들어있다.

자바의 변수는 크게 원시 변수와 레퍼런스, 이렇게 두 가지로 나뉜다.

가비지 컬렉션

  • JVM
    - Java Virtual Machine
    - 운영체제의 메모리 영역에 접근하여 메모리를 관리하는 프로그램
    - 메모리 관리, Garbage Collection을 수행
    • JVM 구조
  • Garbage Collector
    - 동적으로 할당한 메모리 영역 중 사용하지 않는 영역을 탐지하여 해제하는 기능

  • Heap
    - 동적으로 할당한 메모리 영역
    - 모든 Object 타입의 데이터가 할당
    - Heap 영역의 Object를 가리키는 참조 변수가 Stack 영역에 할당
    - Heap은 New Generation 영역과 Old Generation 영역으로 나눠짐

GC Algorithm의 종류

  1. Reference Counting Algorithm
    • Grabage 탐색에 초점을 맞춘 알고리즘
    • 각 개체마다 Reference Count를 관리하며, 이 카운트가 0이 되면 GC를 수행한다.
    • 카운트가 0이 되면 바로 메모리에서 제거된다는 장점이 있지만, 순환 참조 구조에서 Reference Count가 0이 되지 않는 문제가 발생하여 Memory Leak이 발생할 수 있다.
  1. Mark and Sweep Algorithm
    • Reference Counting Algorithm의 단점을 극복하기 위해 나온 알고리즘이다.
    • RSet(Root Set)에서 참조를 추작하여 참조 상황을 파악
    • Mark 단계에서 Garbage 대상이 아닌 객체를 마킹하는 작업을 수행한다.
    • Sweep 단계에서 마킹되지 않은 객체를 지우는 작업을 수행한다.
    • 위 단계를 마친 후 마킹 정보를 초기화 한다.
    • 이 방식은 GC가 동작하고 있을 경우, Mark 작업과 Applicaion Thread의 충돌을 방지하기 위해 Heap 사용이 제한된다.
    • 그리고 Compaction 작업이 없어 비어 있는 공간이 충분하지 않을 경우 Out of Memory가 발생할 수 있다.
  1. Mark and Compact Algorithm
    • Mark-and-Sweep 알고리즘에서 발생하는 점이 메모리 분산(Fragmentation)을 해결하기 위해 나온 알고리즘이다.
    • Sweep 작업 이후 Compact 작업이 추가되어 흩어져 있는 메모리를 모아주는 작업을 진행한다.
    • Compact 작업으로 메모리 효율을 높일 수 있는 장점이 있지만, Compact 작업과 참조를 업데이트하는 작업으로 인해 오버헤드(ex. Stop the World)가 발생할 수 있다.
  1. 일반적인 Garbage Collection의 과정 (Generational Algorithm)
    • 새로운 객체는 Eden 영역에 생성된다.
    • Garbage collector가 Stack의 모든 변수를 스캔하면서 각각 어떤 객체를 참조하고 있는지 마킹
    • Reachable Object가 참조하고 있는 객체도 찾아서 마킹
    • 마킹되지 않은 객체를 Heap에서 제거 (sweep)

New Generation은 다시 Eden, Survival 0, Survival 1로 나눠진다.
새로운 객체는 Eden 영역에 할당된다.
Eden에서 Reachable한 object는 Survival0으로 옮겨진다.
Eden에서 Unreachable 객체는 메모리에서 해제된다.
Survival0에 있던 객체는 Survival1로 이동되고, 객체의 age값이 증가한다.

age값이 특정 값 이상이 되면 Old Generation 영역으로 옮겨진다. 이 과정을 Promotion이라고 한다.

GC의 원리

  • 대부분의 객체는 금방 접근 불가능(Unreachable)한 상태가 된다.
    - 대부분의 객체는 중괄호 안에서 생성되며 이 객체들은 괄호가 끝나는 시점에서 더이상 사용되지 않는다.
    - 특수한 경우에는 오래 사용할 수 있지만, 대부분의 경우 unreachable한 상태가 되어 GC의 대상이 된다.

  • 오래된 객체에서 젊은 객체로의 참조는 아주 적게 발생한다.
    - 일반적으로 순차적인 로직에 의해 객체를 생성하여 활용한다. 이 과정에서 앞에 생성된 객체는 그 다음의 로직에서 사용된 이후 대부분 사용되지 않게 된다.
    - 이러한 특성으로 인해 더이상 참조되지 않는 객체에 대해 GC를 할 수 있게 된다.

Garbage Collection은 JVM에서 GC의 스케줄링을 담당하며 개발자가 직접 관여하지 않아도 더이상 사용하지 않는 점유된 메모리를 제거한다.

Stop The World

  • GC를 수행하기 위해 JVM이 멈추는 현상을 의미한다.
  • GC가 작동하는 동안 GC관련 Thread를 제외한 모든 Thread는 멈춘다.
  • 일반적으로 '튜닝'이라는 것은 이 시간을 최소화하는 것을 의미한다.

GC의 종류

  1. Serial GC
    • 하나의 CPU로 YG와 OG를 연속적으로 처리하는 방식, 가장 오래된 GC이며 Mark-and-Compact 알고리즘을 사용한다. GC가 수행될 때 STW가 발생한다.
  1. Parallel GC
    • 자바 7~8 버전에서 Default로 설정되어 있는 GC이다. Parallel GC의 목표는 다른 CPU가 GC의 진행시간 동안 대기 상태로 남아 있는 것을 최소화 하는 것이다. GC 작업을 병렬적으로 처리하여 STW 시간이 비교적 짧다.
  1. Parallel Compacting GC
    • Parallel GC에서 OG의 처리 알고리즘을 변경한 것이다.
  1. Concurrent Mark-Sweep(CMS) GC
    • Application의 Thread와 GC Thread가 동시에 실행되어 STW를 최소화 하는 GC이다.
    • Parallel GC와 가장 큰 차이점은 Compaction 작업 유무로 구분된다.
  1. Garbage First(G1) GC
    • 큰 메모리에서 사용하기 적합한 GC이다. 대규모 Heap 사이즈에서 짧은 GC 시간을 보장하는데 목적을 둔다.
    • 전체 Heap 영역을 Region이라는 영역으로 분할하여 상황에 따라 역할이 동적으로 부여된다.
  1. Z GC
    • ZPage라는 영역을 사용하며, G1 GC의 Region은 크기가 고정인데 비해 Zpage는 2mb 배수로 동적으로 운영된다.
    • 정지 시간이 최대 10ms를 초과하지 않은 것을 목적으로 운영된다.
    • Heap 크기가 증가하더라도 정지 시간이 증가하지 않는 것이 특징이다.
    • 상용화 되지 않은 방식이다.

튜닝을 한다는 가정 하에 CMS GC와 G1 GC를 가장 많이 사용한다. (2021년 기준)

profile
Pay it forward.

0개의 댓글