Java(1)

Jinny·2021년 3월 3일
0

JAVA

목록 보기
1/8

자바를 너무 쫌쫌따리로만 알고 있어서 제대로 공부하기 위해 'Do it! 자바 프로그래밍 입문' 강의를 듣기 시작했다.
블로그에는 강의에서 정리한 것들과 예전에 정리한 내용들을 올릴 예정

jdk jre

  • jre : java runtime environment. jvm이 자바 프로그램을 동작시킬 때 필요한 라이브러리 파일들과 기타 파일들을 가지고 있음.
  • jdk : java development kit. 자바 개발 도구. jre + 개발에 필요한 도구 들을 포함한다.(java compiler 등)

인터프리터 언어 vs 컴파일 언어

  • 인터프리터 언어: 런타임에 한 문장씩 실행
    • 소스코드 분석하는것은 빠르지만 컴파일된 실행 파일이 만들어지는것이 아니라 실행할때마다 새로 변환해야 한다
      ex) python, javascript
  • 컴파일 언어: 런타임 전에 전체 소스코드를 검사하여 실행 파일로 변환한다. 소스코드 분석하는것은 오래걸리지만 한번 실행하면 실행 파일이 만들어지기 때문에 이후에 실행할때는 효율적이다.

C vs java

프로그램이 실행되기 위해서 windows나 linux같은 운영체제(OS)가 메모리를 제어할 수 있어야 하는데, java 이전의 c같은 언어로 만들어진 프로그램은 이런 이유등으로 OS에 종속되어 실행되었다. java 프로그램은 JVM만 있으면 실행이 가능하며, JVM이 OS에게서 메모리 사용권한을 할당받고 JVM이 자바 프로그램을 호출하여 실행하게 된다.

  • C
    • 같은 소스라도 각 운영 체제에 맞는 컴파일러가 달라서 운영 체제마다 다른 실행 파일(.exe)이 만들어진다. 즉, os에 종속적인 실행 파일이 만들어진다
  • java
    • 소스 코드를 컴파일 하면 바이트 코드(.class)가 만들어지고, 이 바이트 코드는 자바 가상 머신(jvm) 위에서 실행되기 때문에 운영체제에 상관 없이 머신에 jvm만 깔려 있으면 실행할 수 있다. 즉, os에 종속적이지 않다.

JVM

자바 바이트 코드를 실행할 수 있는 주체로, 자바 코드를 컴파일해서 얻는 바이트 코드를 해당 운영체제가 이해할 수 있는 기계어로 바꿔 실행시킨다

  • 구성: 크게 4가지(Class Loader, Execution Engine, Garbage Collector, Runtime Data Area)로 나뉜다.

1. Class Loader

자바에서 소스를 작성하면 Person.java 처럼 .java파일이 생성된다.

.java 소스를 자바컴파일러가 컴파일하면 Person.class 같은 .class파일(바이트코드)이 생성된다.

이렇게 생성된 클래스파일들을 엮어서 JVM이 운영체제로부터 할당받은 메모리영역인 Runtime Data Area로 적재하는 역할을 Class Loader가 한다. (자바 애플리케이션이 실행중일 때 이런 작업이 수행된다.)

2. Execution Engine

Class Loader에 의해 메모리에 적재된 바이트 코드들을 기계어로 변경해 명령어 단위로 실행하는 역할을 한다.

명령어를 하나 하나 실행하는 인터프리터(Interpreter)방식이 있고 JIT(Just-In-Time) 컴파일러를 이용하는 방식이 있다.

JIT 컴파일러는 적절한 시간에 전체 바이트 코드를 네이티브 코드로 변경해서 Execution Engine이 네이티브로 컴파일된 코드를 실행하는 것으로 성능을 높이는 방식이다.

(네이티브 코드: CPU와 OS가 직접 실행할 수 있는 코드. .exe, .dll ...)

3. Garbage Collector

Garbage Collector(GC)는 Heap 메모리 영역에 생성(적재)된 객체들 중에 참조되지 않는 객체들을 탐색 후 제거하는 역할을 한다.

또 다른 특징은 GC가 수행되는 동안 GC를 수행하는 쓰레드가 아닌 다른 모든 쓰레드가 일시정지된다.

특히 Full GC가 일어나서 수 초간 모든 쓰레드가 정지한다면 장애로 이어지는 치명적인 문제가 생길 수 있다.

4. Runtime Data Area

JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역이다.

이 영역은 크게 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack로 나눌 수 있다.

1. Method area (메소드 영역)

클래스 멤버 변수의 이름, 데이터 타입, 접근 제어자 정보같은 필드 정보와 메소드의 이름, 리턴 타입, 파라미터, 접근 제어자 정보같은 메소드 정보, Type정보(Interface인지 class인지), Constant Pool(상수 풀), 메소드에 대한 각종 정보, static 변수등이 생성되는 영역이다.

2. Heap area (힙 영역)

new 키워드로 생성된 인스턴스가 생성되어 동적으로 메모리가 할당되는 영역이다.

메소드 영역에 로드된 클래스만 생성이 가능하다. 스택 영역은 메서드 실행이 끝나면 자동으로 반환되지만, 힙 영역은 Garbage Collector가 참조되지 않는 메모리를 확인하고 제거한다.

3. Stack area (스택 영역)

지역 변수, 파라미터 등 연산에 사용되는 임시 값이 생성되는 영역이다. 메소드를 호출할 때마다 개별적으로 스택이 생성되고, 메서드 실행이 끝나면 자동으로 반환되는 메모리이다.

int a = 10; 이라는 소스를 작성했다면 정수값이 할당될 수 있는 메모리공간을 a라고 잡아두고 그 메모리 영역에 값이 10이 들어간다. 즉, 스택에 메모리에 이름이 a라고 붙여주고 값이 10인 메모리 공간을 만든다.

클래스 Person p = new Person(); 이라는 소스를 작성했다면 Person p는 스택 영역에 생성되고 new로 생성된 Person 클래스의 인스턴스는 힙 영역에 생성된다. 즉, 객체가 선언되면 이 객체는 스택 영역에 생성되고, 그 객체가 가지고 있는 내용들(attribute)은 힙 영역에 생성된다.

그리고 스택영역에 생성된 p의 값으로 힙 영역의 주소값을 가지고 있다. 즉, 스택 영역에 생성된 p가 힙 영역에 생성된 객체를 가리키고(참조하고) 있는 것이다.

이때, 같은 클래스의 다른 객체들이 여러개 생성되면 각각의 내용들이 독립적으로 힙 영역에 쌓인다.

4. PC Register (PC 레지스터)

각 스레드별로 PC Register가 존재하며 JVM 머신이 가장 최근에 실행한 명령어의 주소와 명령을 저장한다.

이것을 이용해서 쓰레드를 돌아가면서 수행할 수 있게 한다.

5. Native method stack

자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역이다.

보통 C/C++등의 코드를 수행하기 위한 스택이다. (JNI)

쓰레드가 생성되었을 때 기준으로

1,2번인 메소드 영역과 힙 영역을 모든 쓰레드가 공유하고,

3,4,5번인 스택 영역과 PC 레지스터, Native method stack은 각각의 쓰레드마다 생성되고 공유되지 않는다.

참조
https://jeong-pro.tistory.com/148

profile
삐약 응애

0개의 댓글