ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바 스터디(1주차)
    CS지식/java 2020. 11. 21. 16:27

    JAVA : 프로그래밍 언어,

    현재는 웹 어플리캐이션 개발에 가장 많은 비중을 차지하는 언어 중 하나

    (취준생 입장에서.. 스프링 개발자를 많이 뽑는거 같아서 주관적인 판단일 수도 있습니다..)

     

     

    ▶︎JVM이란 무엇인가

     

    JVM (JAVA Virtual Machine)이며 컴파일 된 바이트코드를 OS에 맞게 해석해주는 역할을 합니다.

     

    장점 : 운영체제에 맞는 JVM만 설치하게 된다면 운영체제나 버전이 어떻든 간에

    모든 운영체제에서 실행할 수 있다는게 장점 (플랫폼 독립성 및 이식성이 높음)

     

    단점 :

    1. 다른 프로그램의 실행은 하드웨어 -> 운영체제 -> 일반 프로그램 순으로 실행이 된다면

    자바 프로그램의 경우 운영체제와 일반프로그램 사이에 'JVM'이라는 과정이 있기 때문에 타 프로그램에

    비해 실행속도가 느리다.

     

    2. 운영체제에 맞는 JVM을 설치해야 된다는 점에서 가상머신이 운영체제에 종속적이다.

     

    ▶︎컴파일 하는 방법

     

    1. 소스코드 작성 (.java파일)

    2. 이클립스나 인텔리제이 등 개발 툴을 통해 .java파일을 Build 작업을 하게 되면 '자바 컴파일러' javac라는

    명령어를 통해 바이트코드로 됩니다.

     

    ▶︎실행하는 방법

     

    1. 바이트코드로 컴파일 된 코드는 JVM에 들어가게 됩니다.

    2. 이후 JVM가 들어간 바이트 코드를 해석함으로써 자바프로그램이 실행 됩니다. 

    .

    ▶︎바이트코드란 무엇인가

    바이트코드는 자바 가상 머신이 이해할 수 있는 언어로 변환 된 코드를 의미한다

     

    ▶︎JIT 컴파일러란 무엇이며 어떻게 동작하는지

     

    바이트코드를 한줄씩 읽는 인터프리터의 단전을 보완한 바이트 코드 실행엔진

    인터프리터 실행 후 적절한 시점에 바이트 코드 전체를 컴파일, 이후 인터프리팅을 하지 않고 해당 코드를

    직접 실행하는 것을 의미

     

    But 이렇게 생각하면 인터프리터보다 정말 느리다고 생각할 수 있습니다. 왜냐면 전체를 컴파일 한다는건

    시간적인 소요가 체감상 더 크게 느껴지기 때문입니다.

     

    하지만 인터프리터와 달리 JIT 컴파일러는 해석된 코드를 캐시에 보관하기 때문에 반복적인 실행이 요구되는

    과정의 경우 인터프리터 보다 빠른 장점이 있습니다.

     

    그렇기 때문에

    반복적인 작업이 요구되는 경우 : JIT Compiler

    작업이 한번만 요구 되는 경우 : 인터프리터

    가 성능이 좋다고 생각합니다.

     

    ▶︎JVM 구성 요소

     

    일단 이걸 알아야 되는 이유는 일부 기업에서도 정보시스템 성능 저하 요인으로 JVM과 메모리 부족으로 들기 때문에

    개발자로써 어느정도 알아야 한다고 생각한다.

     

    1. 클래스로더 : 런타임 시 클래스 파일을 JVM 내부로 로딩하고, 클래스 파일을 분석한 뒤

    런타임 데이터 영역에 배치

    클래스 파일 중 우선 classpath라는 환경 변수에 등록 된 디렉토리 파일에 있는 클래스를 먼저 JVM에 로딩

    JVM에 로딩된 클래스만 JVM에 객체로 사용이 가능합니다.

     

    자바의 클래스 로딩은 로딩-링크-초기화 과정을 겪습니다.

     

     

    1. 로딩 : 바이트 코드를 메모리로 가져오는 과정

    2. 링크 :  바이트코드의 규칙, 클래스에 정의한 필드, 메소드, 인터페이스를 나타내는 데이터 구조를 준비하고

    해당 클래스가 참조하는 다른 클래스 로딩

    3. 초기화 : 슈퍼클래스 및 정적 필드를 초기화

     

     

    2. 런타임 데이터 영역 : 클래스 로더에서 분석 된 클래스 파일의 데이터를 저장 + 실행에 필요한 데이터 저장

    메모리 효율적 관리를 위해 메모리 영역 (static, heap, stack, pc레지스터, native method stack)에 저장

     

    3. 실행 엔진 : 런타임 데이터 영역에 배치된 바이트 코드를 해석하며 실행

    JIT와 인터프리터 방식을 혼합하여 해석합니다.

     

    초기 JVM은 인터프리터만 활용했지만 현재는 혼용해서 쓰고 있습니다. 인터프리터와 JIT는 위에 설명했습니다.

     

    4. 가비지 컬렉터 : 메모리 관리 기능을 자동으로 수행하는데 보통 잘 안쓰는 객체를 우선적으로 해제시켜 메모리 부족

    을 예방합니다.

     

    <메모리 영역>

     

    클래스(메소드, 스태틱)

    - 가장 먼저 데이터 저장 되는 공간

    - 클래스 로더에 의해 로딩 된 클래스, 메서드, 클래스변수 전역변수를 가져옴

    - 무분별한 사용을 지향하는게 좋은편..

    - 프로그램 시작부터 종료까지 메모리에 남는데 Null을 선언하면 가비지 컬렉터에 의해 오래사용하지 않을경우

    해제된다.

     

    - 런타임시 결정되는 보통 자바 프로그램에서 new를 통해 주소를 할당할 때 그 주소데이터를 저장하는 공간

    - 프로그램 시작부터 종료까지 메모리에 남는데 Null을 선언하면 가비지 컬렉터에 의해 오래사용하지 않을경우

    해제된다.

     

    클래스와 힙은 모든 스레드를 공유한다.

     

    스택

     

    - 컴파일 시 결정되는 기본형 데이터 타입

    - 지역변수, 매개변수, 리턴값, 참조변수 등이 저장됨

    - 메소드 호출 시 메모리에 FILO로 하나씩 실행 (스택느낌?)

    - 메소드 끝날때는 LIFO로 제거

    - 메소드 호출 시 각각의 스택 프레임 생성

     

    {}나 메소드가 끝날때까지 존재함

     

    PC 레지스터 JVM이 수행할 명령어의 주소를 저장하는 공간

    <스레드가 시작할 때 생성>

     

    네이티브 메소드 스택

    - 바이트 코드가 아닌, 기계어로 작성된 코드를 실행하는 공간

    - (C/C++)로 작성된 코드를 수행하기 위한 공간

    - Java Native Interface를 통해 바이트코드로 변환됨

    <Java Native Interface 호출 및 종료시 생성>

     

    메소드, 힙과 달리 각 스레드 별로 스택, PC 레지스터, 네이티브 메소드 스택은 생성된다.

     

     

    ▶︎JDK JRE의 차이

     

    JRE(Java Runtime Environment) 자바실행환경, 읽는 기능을 제공한다

     

    JVM, Java API제공

     

    JDK(Java Development Kit) 자바개발도구, 읽기 및 쓰기(개발) 기능을 제공한다.

    JRE에서 제공을 안해주는 Java Tool, Java Compiler등을 제공(JRE에서 제공해주는 것은 당연히 포함된다)

     

    JVM < JRE < JDK 순으로 포함관계가 되어있다

     

    참고 자료 링크

     

    https://gbsb.tistory.com/2

    https://medium.com/@lazysoul/jvm-%EC%9D%B4%EB%9E%80-c142b01571f2

    https://aljjabaegi.tistory.com/387

    https://steady-snail.tistory.com/67

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    'CS지식 > java' 카테고리의 다른 글

    자바 스터디(3주차)  (0) 2021.01.30
    자바 스터디(2주차)  (0) 2020.11.21

    댓글

Designed by Tistory.