[Java]자바에 대해서

rxjw95·2020년 5월 15일
0

오늘은 내가 좋아하는 자바의 내부 구조에 대해서 알아본다.
자바 도르마무...


java의 탄생

오라클이 썬 마이크로시스템즈를 인수하며...우웁!!

오크(oak)라는 가전 제품용 언어를 시작으로 웹/인터넷이 발전되며 인터넷으로 들어서며 자바(java)라는 언어로 변경되었고 세계에서 엄청난 점유율을 가지는 프로그래밍 언어가 되었다.

java 특징

  • WORA(Write Once, Run Anywhere)
    내가 가장 좋아하는 말이다. "한 번 쓰고, 어디서나 동작한다."
    언어의 대표적인 특징이지만, 나도 어느 분야에 대해 배움을 얻고 어디서나 응용할 수 있는 유연한 사람이 되고 싶다는 생각을 했다.

  • 객체지향 언어 : 그만 설명하고 싶다...

  • 이식성 : JVM(Java Virtual Machine)에 의해 모든 운영체제에서 독립적으로 실행할 수 있다. (WORA를 실현할 수 있는 엄청난 무기)

  • 자동 메모리 관리 : GC(Garbage Collection)가 메모리를 관리해주어, 핵심 기능 개발에만 집중 가능하다.

  • 멀티 스레드 : 자바 언어 자체에 스레드 생성과 제어와 관련된 라이브러리 API를 제공하여 운영체제에 상관없이 멀티 스레드를 쉽게 구현할 수 있다.

  • 동적 로딩 : 실행시 모든 클래스가 로딩되는 것이 아니라 필요한 시점에 클래스를 로딩할 수 있다.(Reflection)

  • 분산 환경 : 자바 언어 자체에 TCP/IP 라이브러리가 포함되어있고, http 프로토콜도 지원한다.

  • 풍부한 오픈소스 : 말할 필요가 있는가...!

java 뜯어보기

java 메모리구조

  • class 영역(= method 영역 = code 영역 = static 영역) : 클래스 정보 , 변수 정보, 메소드 정보(메서드 이름, 리턴타입, 매개변수, 접근제어자), 스태틱 변수 등을 저장
  • stack 영역 : 메서드 호출시마다 메서드 호출을 위한 스택 프레임 생성, 메서드 안에서 사용되는 지역변수, 매개변수, 리턴값 등등을 저장
  • heap 영역 : new 연산자로 생성된 객체 인스턴스, 배열 등을 저장(가비지 컬렉터를 통해 할당된 메모리 반환)
  • Native 메소드 : 자바 외 다른 언어에서 제공되는 메소드들이 저장되는 공간

  • PC 레지스터 : Thread가 생성될 때 생성되는 공간, Thread가 어떤 부분을 어떤 명령으로 실행할 지에 대한 기록, 현재 실행되는 부분의 명령과 주소를 저장

GC(Garbage Collector)

힙 영역 내에서 참조가 없는, 사용되지 않는 객체들을 청소하는 프로그램이다.

보통 크게 2가지 작업을 수행하는데,

  1. 힙내의 객체 중에서 garbage를 찾아낸다.
  2. 찾아는 gabage를 없애고 힙의 메모리를 회수한다.

gabage를 어떻게 판단하는 것인가?

garbage를 영어로 치기 힘드니 쓰레기라고 하겠다^^

객체가 쓰레기인지 판별하기 위해선 reachability 라는 개념을 사용한다.
뜻은 뭐 도달할 수 있는, 접근성 등 여러 뜻이 있는데, 가장 어울리는 뜻은 도달할 수 있는 이라고 생각한다.

어떠한 객체에 유효한 참조가 있으면 reachable, 없으면 unreachable로 구별한다.
그리고 unreachable은 GC가 삭제한다.

이때, 유효한 참조라는 것은 객체 참조에 있어서 유효한 최초의 참조(ROOT SET)을 의미한다.

이 말이 처음 봤을 땐 헷갈렸는데, 방향성 있는 연결 그래프 자료구조를 생각해보면 쉽게 이해가 됬다.
시작(힙 외부)노드에서 도착(힙 내부)노드로 가는 경로가 있냐 없냐의 뜻이라고 생각하면 이해가 된다.

그림을 보고 글을 다시 읽으면 이해가 될 것이다.

런타임 데이터 영역은 위와 같이 스레드가 차지하는 영역들과, 객체를 생성 및 보관하는 하나의 큰 힙, 클래스 정보가 차지하는 영역인 메서드 영역, 크게 세 부분으로 나눌 수 있다.

힙에 있는 객체들에 대한 참조는 다음 4가지 종류 중 하나이다.

  1. 힙 내의 다른 객체에 의한 참조

  2. Java 스택, 즉 Java 메서드 실행 시에 사용하는 지역 변수와 파라미터들에 의한 참조

  3. 네이티브 스택, 즉 JNI(Java Native Interface)에 의해 생성된 객체에 대한 참조

  4. 메서드 영역의 정적 변수에 의한 참조

이들 중 힙 내의 다른 객체에 의한 참조를 제외한 나머지 3개가 root set으로, reachability를 판가름하는 기준이 된다.

파란 영역을 strongly reachable 객체이며 strong reference를 한다.더 많은 정보를 원하면

흔히 예시를 들어본다면

객체 참조가 null일 경우 (Object = null)

객체가 메소드 블럭 안에서 생성되고 블럭이 종료되었을 경우

부모 객체가 null이 되었을 경우, 자식 또는 포함된 객체들은 자동적으로 GC 대상이 된다.


GC에 대해서

위에서 GC가 자동적으로 우리의 불필요한 객체들을 수거하는 동작 과정을 간단히 볼 수 있었다.
하지만 여러 글들을 보며 GC의 방식에 따라 처리 절차가 다른 것도 볼 수 있었고, 사용자 코드로 객체의 reachability를 조절하기 위한 라이브러리(java.lang.ref 패키지의 soft reference, weak reference, phantom reference)가 있음을 확인할 수 있다.

하지만 이러한 지식들은 지금 나에게는 너무 진부하고 욕심이라고 생각해서 정리는 여기까지 해야겠다. 즐겨찾기 해뒀으니 조금 더 자바를 깊이 이해하게 되면 읽어보면 도움될 것 같다.


refs)

딩규님의 개발 블로그
NAVER D2

profile
겉만 핥는 호구🤗

0개의 댓글