serendipity
JAVA 개념 본문
JAVA
자바(Java)는 C++과는 달리 처음부터 객체 지향 언어로 개발된 프로그래밍 언어
현재 자바는 전 세계에서 가장 많이 사용하는 프로그래밍 언어 중 하나다.
자바의 특징
장점)
1. 운영체제와는 독립적으로 실행할 수 있다
2. 불필요한 기능을 과감히 제거하여 다른 언어에 비해 배우기가 쉽다.
3. 자동 메모리 관리 등을 지원하여 다른 언어에 비해 안정성이 높다
4. 연산자 오버로딩을 금지하고 제네릭을 도입함으로써 코드의 가독성을 높였다.
단점)
1. 실행을 위해 자바 가상 머신을 거쳐야 하므로, 다른 언어에 비해 실행 속도가 느리다.
2. 예외 처리가 잘 되어 있지만, 개발자가 일일이 처리를 지정해 줘야 한다는 불편함이 있다.
3. 다른 언어에 비해 작성해야 하는 코드의 길이가 긴 편이다.
프로그램 실행 과정
자바 컴파일러(Java compiler)
자바를 가지고 작성한 자바 소스 코드를 자바 가상 머신이 이해할 수 있는 자바 바이트 코드로 변환
자바 컴파일러는 자바를 설치하면 javac.exe라는 실행 파일 형태로 설치
자바 바이트 코드(Java bytecode)
자바 가상 머신이 이해할 수 있는 언어로 변환된 자바 소스 코드를 의미
자바 컴파일러에 의해 변환되는 코드의 명령어 크기가 1바이트라서 자바 바이트 코드라고 불림
이러한 자바 바이트 코드의 확장자는 .class
자바 가상 머신(JVM)
자바 바이트 코드를 실행시키기 위한 가상의 기계
자바로 작성된 모든 프로그램은 자바 가상 머신에서만 실행될 수 있으므로, 자바 프로그램을 실행하기 위해서는 반드시 자바 가상 머신이 설치되어 있어야 한다.
따라서 오라클은 대부분의 주요 운영체제뿐만 아니라 웹 브라우저, 스마트 폰 등에서도 손쉽게 설치할 수 있도록 지원하고 있다.
자바 가상 머신의 구성
1. 자바 인터프리터(interpreter)
: 자바 컴파일러에 의해 변환된 자바 바이트 코드를 읽고 해석하는 역할
2. 클래스 로더(class loader)
: 동적으로 클래스를 로딩해주는 역할
(자바는 동적으로 클래스를 읽어오므로, 프로그램이 실행 중인 런타임에서야 모든 코드가 자바 가상 머신과 연결된다.)
3. JIT 컴파일러(Just-In-Time compiler)
: 프로그램이 실행 중인 런타임에 실제 기계어로 변환해 주는 컴파일러
4. 가비지 컬렉터(garbage collector)
: 더는 사용하지 않는 메모리를 자동으로 회수
Runtime Data Area
: JVM이 OS로부터 메모리를 할당받은 공간
PC 레지스터 영역
각 스레드마다 하나씩 생성되는 영역이다. 현재 수행 중인 JVM 명령의 주소값을 저장한다.
여기서 JVM 명령이라는 것은, 스레드가 어떤 것을 어떤 명령으로 실행해야할 지 결정하는 부분!
스택 영역
메소드 안에서만 사용되는 리턴값, 매개변수, 지역변수 등 지역적인 값이나 스레드나 메소드 그 자체에 대한 정보가 저장되는 영역이다. 호출될 때 LIFO(Last in First out) 방식으로 하나씩 생성되어 스택 영역이라고 부른다.
메소드 실행이 완료될 때마다 이 스택에서 해당 메소드의 값을 pop하여 하나씩 지워가는 방식으로 동작한다.
Native Method Stack
다른 프로그램들처럼 커널이 독자적으로 Java 프로그램을 실행하는 공간이다. C, C++ 등 다른 언어의 메소드 호출을 위해 할당되는 구역 언어에 맞게 Stack이 형성되는 영역이다. 쉽게 말해 기계어로 번역된 프로그램이 실행되는 곳이다.
이상이 스레드가 시작될 때마다 각 스레드마다 생성되는 영역이고, 이하는 하나의 Java 프로그램이 시작될 때 모든 스레드가 공유하는 영역이다.
메소드 영역
클래스 영역이나 스태틱 영역이라고도 부른다.
이 영역에 메소드 정보, 클래스 정보, static으로 선언된 변수 정보, 상수 정보가 담기기 때문이다.
우리가 Java 코드 작성할 때, 클래스 정보가 처음 메모리 공간에 올라갈 때 초기화하고자 하는 대상들에 대한 정보들이 담긴다. *static으로 선언된 변수는 이미 그 정보가 JVM 내에서 다른 변수들보다 우선시되어 저장된다는 것.
Java 프로그램은 main 메소드부터 호출하여 연속된 메소드 호출로 전체적인 프로그램의 흐름을 이어가기 때문에, 거의 대부분의 바이트코드가 이 영역에 저장된다. 변수와 메소드의 이름, 데이터 타입, 접근 제어자, 형식 등등 대부분의 정보가 저장된다.
힙 영역
메소드 영역과는 다르게, 객체를 저장하는 가상 메모리 공간이다. new 명령어를 사용해서 생성한 모든 인스턴스와 객체들이 이 영역에 저장된다. Garbage Collection Issue가 이 영역에서 일어난다.
Reference