JVM (Java Virtual Machine)
자바를 실행하기 위한 가상 기계(컴퓨터)
- Java는 OS에 종속적이지 않다는 특징을 가진다. OS에 종속받지 않고 실행되기 위해선 OS위에서 Java를 실행시킬 무언가가 필요한데 그게 바로 JVM이다.
즉, OS에 종속받지 않고 CPU 가 Java를 인식, 실행할 수 있게 하는 가상 컴퓨터

Java 소스코드, 즉 원시코드(.java)sms CPU가 인식을 못 하므로 기계어로 컴파일 해줘야 한다.
하지만 Java는 이 JVM이라는 가상머신을 거쳐 OS에 도달하기 때문에 OS가 인식할 수 있는 기계어로 바로 컴파일되는게 아니라 JVM이 인식할 수 있는 Java byte cod(.class)로 변환된다.
- OS란? 운영체제(Operating System)는 컴퓨터 시스템의 자원들을 효율적으로 관리하며, 사용자가 컴퓨터를 편리하고, 효과적으로 사용할 수 있도록 환경을 제공하는 여러 프로그램의 모임.
컴퓨터 사용자와 컴퓨터 하드웨어 간의 인터페이스로서 동작하는 시스템 소프트웨어의 일종으로, 다른 응용프로그램이 유용한 작업을 할 수 있도록 환경을 제공
JVM 구성요소


JVM은 크게 아래와 같이 이루어져 있다.
- 클래스 로더(Class Loader)
- 실행 엔진(Execution Engine)
- 인터프리터(Interpreter)
- JIT 컴파일러(Just-in-Time)
- 가비지 콜렉터(Garbage collector)
- 런타임 데이터 영역 (Runtime Data Area)
클래스 로더(Class Loader)

- JVM 내로 클래스 파일을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈이다.
- 런 타임 시 동적으로 클래스를 로드하고 jar파일 내 저장된 클래스들을 JVM 위에 탑재한다.
즉, 클래스를 처음으로 참조할 때, 해당 클래스를 로드하고 링크하는 역할을 한다.
클래스 로더 시스템
로딩 -> 링킹 -> 초기화
-
로딩 - 클래스 로더가 .class 파일을 읽고 데이터를 “Method Area”영역에 저장
-fqcn : 패키지를 포함한 클래스 이름 -> java.lang.String ->
ex) java.lang.String@1233432532
-클래스 / 인터페이스 / 이늄
-메소드와 변수
-
링킹 - 연결을 하는 작업
-
이니셜라이전(초기화) - Static이 붙은 친구들 초기화 .static 블럭 실행
클래스로딩시점에 스테틱친구들이 초기화됨
public class Practice {
public static String STATIC_MESSAGE = "응애";
static {
System.out.println("I'm Loading");
System.out.println(STATIC_MESSAGE + "2");
}
}
public class Main {
public static void main(String[] args) {
String staticMessage = Practice.STATIC_MESSAGE;
System.out.println("Hello");
System.out.println(staticMessage);
}
}
결과:
I'm Loading
응애2
Hello
응애
실행 엔진(Execution Engine)
- 클래스를 실행시키는 역할
- 클래스 로더가 JVM내의 런타임 데이터 영역에 바이트 코드를 배치시키고, 이것은 실행 엔진에 의해 실행된다.
- 자바 바이트 코드(*.class)는 기계가 바로 수행할 수 있는 언어보다는 비교적 인간이 보기 편한 형태로 기술된 것이다. 그래서 실행 엔진은 이와 같은 바이트 코드를 실제로 JVM 내부에서 기계가 실행할 수 있는 형태로 변경한다.
인터프리터(Interpreter)
- 실행 엔진은 자바 바이트 코드를 명령어 단위로 읽어서 실행한다.
- 하지만 한 줄씩 수행하기 때문에 느리다는 단점이 있다.
JIT 컴파일러(Just-in-Time)
- 인터프리터 방식으로 실행하다가 적절한 시점에 바이트 코드 전체를 컴파일하여 기계어로 변경하고, 이후에는 해당 더 이상 인터프리팅 하지 않고 기계어로 직접 실행하는 방식이다.
가비지 콜렉터(Garbage collector)
- 더이상 사용되지 않는 인스턴스를 찾아 메모리에서 삭제함.
PC Register
- Thread가 시작될 때 생성되며 생성될 때마다 생성되는 공간으로, 스레드마다 하나씩 존재한다.
- Thread가 어떤 부분을 어떤 명령으로 실행해야할 지에 대한 기록을 하는 부분으로 현재 수행 중인 JVM 명령의 주소를 갖는다.
Runtime Data Area

- 프로그램을 수행하기 위해 OS에서 할당받은 메모리 공간

Method Area (= Class Area = Static area) : 클래스와 static들
- 클래스 정보를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간
Method Area (클래스 영역 or 스태틱 영역)에 저장되는 데이터:
-
Field Information (멤버 변수!)
멤버변수의 이름, 데이터 타입, 접근 제어자에 대한 정보
-
Method Information (메소드!)
메소드의 이름, 리턴타입, 매개변수, 접근 제어자에 대한 정보
-
Type Information (타입!)
class인지 interface인지의 여부 저장. Type의 속성, 전체 이름, super 클래스의 전체 이름. (interface이거나 object인 경우 제외된다. 이건 Heap에서 관리함)
JVM 스택 영역 : 메서드들
- 프로그램 실행과정에서 임시로 할당되었다가 메소드를 빠져나가면 바로 소멸되는 특성의 데이터를 저장하기 위한 영역이다.
- 각종 형태의 변수나 임시 데이터, 스레드나 메소드의 정보를 저장한다.
- 메소드 호출 시마다 각각의 스택 프레임(그 메서드만을 위한 공간)이 생성된다. 메서드 수행이 끝나면 프레임 별로 삭제를 한다.
- 메소드 안에서 사용되는 값들을 저장한다. 또 호출된 메소드의 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값들을 임시로 저장한다.
Native method stack
- 자바 프로그램이 컴파일되어 생성되는 바이트 코드가 아닌 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역.
- JAVA가 아닌 다른 언어로 작성된 코드를 위한 공간.
- Java Native Interface를 통해 바이트 코드로 전환하여 저장하게 된다.
- 일반 프로그램처럼 커널이 스택을 잡아 독자적으로 프로그램을 실행시키는 영역
Heap 영역 : 객체(instance)들

- 객체를 저장하는 가상메모리 공간. new 연산자로 생성되는 객체와 배열을 저장한다.
- Class Area(Static Area)에 올라온 클래스들만 객체로 생성할 수 있다.(당연함)
- 힙은 세 부분으로 나뉘어 진다.

->코드가 실행되는 과정
java c java 컴파일러로 바이트 코드가 만들어짐 app.java -> app.class 로 확장자변경 jre로 넘어옴 jvm으로 들어옴 클래스 소스가 들어와서 메모리에 들어감
메서드 영역 - 클래스
스택, 스레드 영역 - 함수, 메서드
힙 - 인스턴스
JDK
- Java Development Kit (자바 개발 키트) : Java 를 사용하기 위해 필요한 모든 기능을 갖춘 Java용 SDK (Software Development Kit)
- Jdk : 폴더형태임. 안에 jre라는 폴더가 있음. (JDK 는 JRE를 포함하고 있다.)
- java development tool kits -> 개발자도구+ jre
- JRE에 있는 모든 것 뿐만 아니라 컴파일러(javac)와 jdb, javadoc 과 같은 도구도 있다.
- 즉, JDK는 프로그램을 생성, 실행, 컴파일할 수 있다.
- .java 파일을 자바 컴파일러가 바이트 코드(.class) 로 바꿔줌
그리고 os와 하드웨어를 통해 자바코드가 동작할 수 있게 처리를 해주는 것이 jvm이다.
SDK 란?
- 하드웨어 플랫폼, 운영체제 또는 프로그래밍 언어 제작사가 제공하는 툴이다. 키트의 요소는 제작사마다 다르다.
SDK의 대표적인 예로, JDK 등이 있다.
SDK를 활용하여 애플리케이션을 개발할 수 있다.
JRE
- Java Runtime Environment (자바 런타임 환경)
- java runtime environment <- 자바가 실행하는 실행환경+ JVM + 자바 클래스 라이브러리(Java Class Library)
- 컴파일 된 Java 프로그램을 실행하는데 필요한 패키지이다.
요약
JDK는 자바 프로그램을 실행, 컴파일, 개발용 도구.
JRE, JVM를 모두 포함하는 포괄적이 키트이다.
JRE는 자바 프로그램을 실행할 수 있게 하는 도구이다. JVM을 포함하고 있다.
jre에는 자바에서 제공되는 기본 라이브러리들이 포함됨.
jar, zip도 들어있다! 까지만 알기
참고자료: https://doozi0316.tistory.com/entry/1%EC%A3%BC%EC%B0%A8-JVM%EC%9D%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EB%A9%B0-%EC%9E%90%EB%B0%94-%EC%BD%94%EB%93%9C%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%8B%A4%ED%96%89%ED%95%98%EB%8A%94-%EA%B2%83%EC%9D%B8%EA%B0%80
이외 학습한 정보들
-
stack over flow : 스택이 넘치는 것
-
heap over flow : 힙이 넘치는 것
-
setLenient - 날짜를 엄격하게 체크하겠다.
-
parse() - 날짜를 yyyymmdd 로
-
pkg가 다르면 같은 이름의 class를 여러개 쓸 수 있음
jvm이 pkg를 포함한 뭐뭐로 구별하기 때문..
-
package 는 소문자여야함! : 클래스와 인터페이스가 대문자로 시작해서 충돌할 수 있음
-
ssd에 있는 상태 : program
-
ram에 있는 상태 : process
-
loading : ssd에서 ram으로 올리는 과정
cpu 안에
주소값 : 1 2 3
키값 (value) : 10100111 0010011 11111001

포인터 : 변수이긴한데 값이 아니라 주소를 저장하는 변수

콜바이레퍼런스 : 주소값으로 // 값이 변경이되고
콜바이벨류 : 값이 들어감 // 값이 변경이 안 됨
참고 : https://deveric.tistory.com/92

- 🎁 추가적으로 공부가 필요한 키워드
- 🗿 Block과 Scope
- 🛺 Auto Boxing / Unboxing
- 💌 Call By Value
- 🤹♀️ Mutable / Immutable
Block
- 블록은 중괄호 {} 세트 안에 있는 코드를 말한다.
- 블록은 하나 이상의 구문을 그룹화하는 데 도움이 되며, 코드의 구조적인 마커 역할을 한다고 보면 된다.
Scope
- 변수가 선언되는 컨텍스트(context)를 의미
- 함수내에 변수에 대한 접근이 어떻게 되는지를 나타내는 용어.
- 변수에 접근할 수 있는 범위
- 컨텍스트 : 웹 실행시에 실시간으로 생성되어 참조되는 문맥정보??
- 전역 스코프 (Global Scope)
- 만약 변수가 블록 외부에서 선언되면 전역 스코프를 따른다. (이러한 변수를 전역 변수라 한다.)
- 전역 변수는 블록 안으로 범위가 제한되는 게 아니기 때문에 프로그램의 모든 코드에서 액세스 할 수 있다.
- 블록 스코프 (Block Scope)
- 만약 변수가 블록 안에서 정의되면 중괄호 {} 내의 코드에서만 액세스 할 수 있는데, 이를 블록 스코프에 있다고 말한다.
- 블록 범위에서 선언된 변수는 동일한 블록 내에서만 사용할 수 있기 때문에 전역 변수가 아니라 로컬 변수라고 부른다.
- 블록 외부에서 내부로 접근할 수 없다는 뜻
- 스코프 오염 (Scope Pollution)
- 전역 네임 스페이스에 너무 많은 전역 변수가 존재하거나, 다른 범위에서 변수를 재사용하는 상황이 오는 것
- 스코프 오염을 막는 방법 : 블록 스코프를 잘 사용해서 변수의 사용 범위를 엄격하게 제한
참고 : https://hleecaster.com/javascript-scope/
Auto Boxing / Unboxing
Auto Boxing
- 원시 타입의 값을 해당하는 wrapper 클래스의 객체로 바꾸는 과정을 의미
- 기본타입(int,long,double등)같은 타입을WrapperClass(Interger,Long,Double 등)객체로 자동 형변환해주는 것.
- int n1 = 10; →(AutoBoxing) Integer a1 = n1;
Unboxing
-
Wrapper 클래스 타입을 원시 타입으로 변환하는 과정의 의미
-
Wrapper class 객체 타입을 기본타입으로 형변환 해주는 것.
-
Integer a1 = Interger.valueOf(10); →(Unboxing) int b1 = a1
-
int -> intiger : 오토박싱 / intiger -> int : 언박싱
참고 : https://jwdeveloper.tistory.com/148
Call By Value
-
Call by Value 는 메서드를 호출할 때 값을 넘겨주기 때문에 Pass by Value 라고도 부릅니다.
-
메서드를 호출하는 호출자 (Caller) 의 변수와 호출 당하는 수신자 (Callee) 의 파라미터는 복사된 서로 다른 변수입니다.
-
값만을 전달하기 때문에 수신자의 파라미터를 수정해도 호출자의 변수에는 아무런 영향이 없습니다.
-
함수 호출 시 전달되는 변수 값을 복사해서 함수 인자로 전달함. 이때 복사된 인자는 함수 안에서 지역적으로 사용되기 때문에 local value 속성을 가짐. 따라서, 함수 안에서 인자 값이 변경되더라도, 외부 변수 값은 변경안됨
-
JAVA에서 Call by reference는 해당 객체의 주소값을 직접 넘기는 게 아닌 객체를 보는 또 다른 주소값을 만들어서 넘기다는 사실을 기억
-
CallByReference: 함수 호출 시 인자로 전달되는 변수의 참조값을 전달함. 따라서 함수 안에서 인자 값이 변경되면, 아규먼트로 전달된 객체의 값도 변경됨
참고 : https://bcp0109.tistory.com/360
Mutable / Immutable
Mutable
Immutable
수정이 필요할 경우 Mutable 객체는 기존의 객체에 수정사항을 곧바로 반영한다. 하지만 Immutable 객체의 경우 기존의 객체는 그대로 두고 수정사항을 반영한 새로운 객체를 생성한다는 점에서 차이가 있다.

참고 : https://velog.io/@guswlsapdlf/Java%EC%9D%98-Mutable%EA%B3%BC-Immutable