Skip to content

static[x]

jsjune edited this page Mar 16, 2022 · 5 revisions

static이란?

  • 정적(static)은 고정된이란 의미를 가지고 있다.
  • static은 전역적으로 쉽게 재사용하는 멤버나 잘 변하지 않는 변수나, 메소드를 사용할때 주로 사용된다.
  • 만들어 놓고 클래스 호출, 객체 생성을 따로 할 필요없이 바로바로 사용할 수 있기 때문에 사용성이 좋다.
  • Static이라는 키워드를 사용하여 Static변수와 Static 메소드를 만들 수 있는데 이 둘을 합쳐 정적(클래스) 멤버라고 한다.
  • 클레스 멤버는 객체(인스턴스)에 소속된 멤버가 아니라 클래스에 고정된 멤버이다.
  • 클래스 로더가 클래스를 로딩해서 메소드 메모리 영역에 적재할때 클래스별로 관리된다.
  • 클래스이 로딩이 끝나는 즉시 바로 사용할 수 있다.
  • static 키워드를 통해 생성된 정적멤버들은 Heap영역이 아닌 static영역에 할당된다.
  • static 영역에 할당된 메모리는 모든 객체가 공유하여 하나의 멤버를 어디서든지 참조할 수 있는 장점을 가지지만 garbage collector의 관리 영역 밖에 존재하기에 static영역에 있는 멤버들은 프로그램의 종료시까지 메모리가 할당된 채로 존재한다.
  • 그렇기에 static을 너무 남발하게 되면 만들고자 하는 시스템 성능에 악영향을 줄 수 있다.
  • static은 메모리 자원을 할당해놓고 사용하는 것이기 때문에 너무 많이 사용한다면 메모리를 많이 차지하게 되어서 프로그램이 무거워진다.




JRE(Java Runtime Environment)

  • JRE는 자바 실행 환경으로 자바로 만들어진 프로그램을 실행시키는데 필요한 라이브러리들과 각종 API, 그리고 JVM이 포함되어 있다.
  • JRE는 자바로 "개발(쓰기)은 안되고 실행(읽기)만 된다."

JDK(Java Development Kit)

  • JDK는 개발자들이 자바로 개발하는데 사용된다.
  • JDK안에는 개발 시 필요한 라이브러리들과 javac, javadoc 등의 개발 도구들을 포함되어 있고 개발을 하려면 당연히 실행도 시켜줘야 하기 때문에 JRE도 함께 포함되어 있다.

  • Java로 프로그램을 직접 개발하려면 JDK가 필요하고 Java로 만들어진 프로그램을 실행시키려면 JRE가 필요하다.



- 디렉터리 구성요소

  • bin : 자바 개발, 실행에 필요한 도구와 유틸리리 명령
  • conf : 여러 종류의 패치 파일
  • include : 네이티브 코드 프로그래밍에 필요하는 C언어 헤더 파일
  • jmods : 컴파일된 모듈 파일들
  • legal : 각 모듈에 대한 저작권과 라이선스 파일
  • lib : 실행 시간에 필요한 라이브러리 클래스들

- bin 디렉터리에 들어 있는 주요한

  • javac : 자바 컴파일러로 자바 소스를 바이트 코드로 변환
  • java : 자바 프로그램 실행기 -> 자바 가상 기계를 작동시켜 자바 프로그램 실행
  • javadoc : 자바 소스로부터 HTML 형식의 API 도큐먼트 생성
  • jar : 자바 클래스 파일을 압축한 자바 아카이브 파일(.jar) 생성, 관리
  • jmod : 자바의 모듈 파일(.jmod)을 만들거나 모듈 파일의 내용 출력
  • jlink : 응용프로그램에 맞춘 맞춤형 JRE 생성
  • jdb : 자바 응용프로그램의 실행 중 오류를 찾는데 사용하는 디버거
  • javap : 클래스 파일의 바이트 코드를 소스와 함께 보여주는 디어셈블러

- JVM(Java Virtual Machine

  • 자바 가상 머신은 자바 프로그램 실행환경을 만들어 주는 소프트웨어이다.
  • 자바 코드를 컴파일하여 .class(바이트코드)로 만들면 이 코드가 자바 가상 머신 환경에서 실행된다.
    • 컴파일 : 어떤 언어의 코드를 다른 언어로 바꿔주는 과정.
  • JVM은 JRE에 포함되어 있다.
  • 현재 사용하는 컴퓨터의 운영체제에 맞는 자바 실행환경(JRE)가 설치되어 있다면 자바 가상 머신이 설치되어 있다는 뜻이다.
  • JVM을 사용하면 하나의 바이트 코드(.class)로 모든 플랫폼에서 동작하도록 할 수 있다.
    • .class 파일은 바이트 코드라고 하는데 사람이 쓰는 자바 코드에서 컴퓨터가 읽는 기계어로의 중간 단계라고 생각하면 된다.
  • java의 경우에는 java언어로 작성된 Test.java는 컴파일하면 Test.class파일이 생성된다.
  • 이렇게 생성된 바이트 코드는 각자의 플랫폼에 설치되어 있는 자바 가상 머신이 운영체제에 맞는 실행 파일로 바꿔 준다.
  • 하나의 바이트 코드로 JVM이 설치되어 있는 모든 플랫폼에서 동작이 가능하다.
  • Java는 플랫폼에 종속적이지 않지만 JVM은 플랫폼에 종속적이다. (운영체제떄문에)
  • JVM은 플랫폼에 의존적이다. 즉 리눅스의 JVM과 윈도우의 JVM은 서로 다르다.
  • 자바로 작성된 모든 프로그램은 자바 가상 머신에서만 실행될 수 있으므로, 자바 프로그램을 실행하기 위해서는 반드시 자바 가상머신이 설치되어 있어야 한다.

  • 자바 프로그램의 실행 과정과 JVM



  • 바이트 코드를 읽는 방식
    • JVM은 바이트코드를 명령어 단위로 읽어서 해석하는데, Interpreter 방식과 JIT 컴파일 방식 두 가지 방식을 혼합하여 사용
    • 바이트코드를 JIT 컴파일러를 이용해 프로그램을 실제 실행 하는 시점(바이트코드를 실행하는 시점)에 각 OS에 맞는 Native Code로 변환하여 실행 속도를 개선하였다.
    • JVM은 모든 코드를 JIT 컴파일러 방식으로 실행하지 않고, 인터프리터 방식을 사용하다가 일정 기준이 넘어가면 JIT 컴파일 방식으로 명령어를 실행한다.
    • 기존의 자바는 인터프리터 방식으로 명령어를 하나씩 실행하게끔 이루어져 있어 실행 속도가 느렸다.
    • JIT 컴파일러는 같은 코드를 매번 해석하지 않고, 실행할 때 컴파일을 하면서 해당 코드를 캐싱해버린다.
    • 이후에는 바뀐 부분만 컴파일하고, 나머지는 캐싱된 코드를 사용한다.
    • 이렇게 JIT컴파일러는 운영체제에 맞게 바이트 실행 코드로 한번에 변환하여 실행하기 때문에 이전의 자바 인터프리터방식보다 성능이 10~20배 더 좋아졌다.




- 자바 가상 머신(JVM)의 동작 방식

  1. 자바로 개발된 프로그램을 실행하면 JVM은 OS로부터 메모리를 할당한다.
  2. 자바 컴파일러(javac)가 자바 소스코드(.java)를 자바 바이트코드(.class)로 컴파일한다.
  3. Class Loader를 통해 JVM Runtime Data Area로 로딩한다.
  4. Runtim Data Area에 로딩 된 .class들은 Execution Engine을 통해 해석한다.
  5. 해석된 바이트 코드는 Runtime Data Area의 각 영역에 배치되어 수행하며 이 과정에서 Execution Engine에 의해 GC의 작동과 스레드 동기화가 이루어진다.

- JVM의 구조

  • 클래스 로더(Class Loader)
  • 자바는 동적으로 클래스를 읽어오므로, 프로그램이 실행 중인 런타임에서야 모든 코드가 자바 가상 머신과 연결된다.
  • 이렇게 동적으로 클래스를 로딩해주는 역할을 하는 것이 바로 클래스 로더입니다.
  • 자바에서 소스를 작성하면 .java파일이 생성되고 .java소스를 컴파일러가 컴파일하면 .class파일이 생성되는데 클래스 로더는 .class파일을 묶어서 JVM이 운영체제로부터 할당받은 메모리 영역인 Runtime Data Area로 적재한다.

  • 실행 엔진(Execution Engine)
    • 클래스 로더에 의해 JVM으로 로드된 .class파일(바이트코드)들은 Runtime Data Areas의 Method Area에 배치되는데, 배치된 이후에 JVM은 Method Area의 바이트 코드를 실행 엔진(Execution Engine)에 제공하여, 정의된 내용대로 바이트 코드를 실행시킨다.
    • 이때, 로드된 바이트코드를 실행하는 런타임 모듈이 실행 엔진(Execution Engine)이다.
    • 실행 엔진은 바이트코드를 명령어 단위로 읽어서 실행한다.

  • 가비지 컬렉터(Garbage Collector)
  • 자바 가상 머신은 가비지 컬렉터를 이용하여 더는 사용하지 않는 메모리를 자동으로 회수해 준다.
  • 따라서 개발자가 따로 메모리를 관리하지 않아도 되므로, 더욱 손쉽게 프로그래밍을 할 수 있도록 도와준다.
  • Heap 메모리 영역에 생성(적재)된 객체들 중에 참조되지 않은 객체들을 탐색 후 제거하는 역할을 하며 해당 역할을 하는 시간은 정확히 언제인지를 알 수 없다.
  • GC역할을 수행하는 스레드를 제외한 나머지 모든 스레드들은 일시정지상태가 된다.

  • 런타임 데이터 영역(Runtime Data Area)
  • 런타임 데이터 영역은 JVM의 메모리 령역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역이다.
  • 모든 스레드가 공유해서 사용(GC의 대상)
    • 힙 영역(Heap Area)
    • 메서드 영역(Method Area)
  • 스레드(Thread) 마다 하나씩 생성
    • 스택 영역(Stack Area)
    • PC 레지스터(PC Register)
    • 네이티브 메서드 스택(Native Method Stack)

  • 메서드 영역(Method Area)

    • 클래스 멤버 변수의 이름, 데이터 타입, 접근 제어자 정보와 같은 각종 필드 정보들과 메서드 정보, 데이터 Type 정보, Constant Pool, static변수, final class 등이 생성되는 영역이다.
  • 힙 영역(Heap Area) [x]

    • new 키워드로 생성된 객체와 배열이 생성되는 영역이다.
    • 주기적으로 GC가 제거하는 영역이다.
  • 스택 영역(Stack Area)

    • 지역변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값 등이 생성되는 영역이다.
  • PC 레지스터 (PC Register)

    • Thread가 생성될 때마다 생성되는 영역으로 프로그램 카운터, 즉 현재 스레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역이다.
  • 네이티브 메서드 스택(Native Method Stack)

  • [출처] : ("https://coding-factory.tistory.com/")

Clone this wiki locally