240520
오늘의 학습
● 1. JVM
1. 자바 프로그램을 실행하기 위한 구성 요소 3가지
2. JVM의 동작 원리
3. 자바 프로그램의 생명주기
앞서 나가기 전에 알아두면 좋은점
자바는 객체지향 프로그래밍 언어이며 절차적,구조적 프로그래밍 또한 지원하는 언어이다.
절차적 : 코드를 순차적 즉, 절차적으로 진행한다는 의미이다.
구조적 : 함수 즉, 메서드라는 개념을 통해 프로그램 흐름을 분기하는 개념이다. 유지보수가 좋아짐.
0. 자바의 클래스와 객체의 차이
사람이라는 클래스는 이름, 나이, 성별 이렇게 추상화된 요소를 가지고 있다.
사람이라는 클래스를 통해 객체를 만들면 이름 : 홍길동, 나이 : 230, 성별 : 남 이렇게 객체는 클래스를 구현했다고 봐도 무방하다. 즉, 객체는 클래스의 구현체인 셈이다. 여러가지 다양한 사람들의 정보를 넣을 수 있게 추상화가 되어있다는 의미이다. 붕어빵틀을 예시로 보면 붕어빵틀에서 붕어빵을 찍어낸다는 얘기가 이해가 될 것이다.
public static void main(String[] args) {
Brand benz = new Brand();
Brand hyundai = new Brand();
Brand samsung = new Brand();
}
자바 코드 예시를 보면 new Brand => Brand라는 클래스를 실체화를 해서 객체로 만들어낸 코드이다.
실체화를 한 객체에는 benz라는 이름을 부여를 해주었다. 이러면 하나의 객체가 된 셈이다.
이 예시를 통해 알 수 있는 점은 클래스는 그냥 하나의 추상화된 정보일뿐 그 추상화된 정보를 토대로 여러가지 객체를
생성을 할 수 있다는 것을 알 수 있다.
1. 자바 프로그램을 실행하기 위한 구성 요소 3가지
JDK : Java Development Kit / 자바 개발 도구
JRE : Java Runtime Environment / 자바 실행 환경
JVM : Java Virtual Machine / 자바 가상 기계
( JDK 안에는 JRE 안에는 JVM을 포함하는 구조이다. )
JDK
1. JDK에는 javac.exe(자바 소스 컴파일러)를 가지고 있다.
2. javac.exe(컴파일러)를 통해 .java 파일을 .class파일로 바꿔준다.
JRE
1. java.exe(자바 프로그램 실행기)를 가지고있다.
2. JRE에서 java.exe를 실행하면 JVM이 실행된다.
JVM
1. JRE를 통해 실행이 되면 JVM은 운영체제로 부터 메모리를 할당을 받는다.
2. 할당을 받은 메모리를 3개의 영역으로 분리하여 사용을 하게 된다.
2. JVM의 동작 원리
JRE를 통해 java.exe가 실행이 된다면 먼저 해당 프로그램의 main()메서드를 찾게 되고 main메서드의 존재가 확인이 된다면 JRE가 JVM을 실행을 시켜준다. JVM은 실행이 되면서 메모리를 운영체제로 부터 할당을 받는다.
할당을 받은 메모리를 JVM은 JVM내에서 3개의 영억으로 분리하여 메모리를 사용하게 된다.
이것을 T메모리 라고 부른다.
1. Static영역 - 모든 클래스들을 가지고 있는 정적인 영역
2. Stack영역 - 메서드가 존재하는 영역 ( 매우 많은 변화가 일어나는 곳 실제 눈으로 보는 코드의 따른 메모리 흐름 )
3. Heap영역 - 객체가 존재하는 영역
1. Static영역
자바 프로그램이 시작되면 제일 먼저 java.lang패키지와 작성한 클래스들이 static영역에 모두 올라가게 된다.
static영역에는 모든 클래스가 올라가기 때문에 static키워드를 이용하여 필드에 변수를 선언을 해두면
해당 값을 공유하여 사용할 수 있다. 다른 메서드에서 값을 수정하면 알기 쉽지 않다는 단점이 존재한다.
2. Stack영역
main메서드는 가장 먼저 Stack영역에 스택프레임 영역을 만들어 들어가게 된다.
즉, Stack영역은 메서드들이 공유하는 영역이며 그 안에서 메서드가 생성이 된다면 Stack영역 내에서 또 다른
스택프레임 영역을 만들어 사용을 하게 되는 것이다.
정리를하면 제어 흐름에 따라 main() 메서드의 "{" 중괄호를 만나게 된다면 Stack에 메인 스택 프레임 영역이 만들어져서
그곳 안에서 main() 메서드 내부에 로직이 수행이 된다. 이때 메인 스택 프레임 영역에 존재하는 변수를 지역변수 라고 하는 것이다. 즉, 메서드 내부의 지역변수는 메서드의 소멸과 함께 생명주기가 끝난다.
Stack영역은 메서드들이 유동적으로 만들어졌다가 사라지는 영역인 것이다. 매우 많은 변화가 일어나는 곳!
3. Heap영역
자바의 new키워드를 통해 객체를 생성하면 해당 객체가 Heap영역에 올라가게 된다.
public class Brand {
}
public static void main(String args[]) {
Brand benz = new Brand();
}
예제 코드를 보면서 실행 순서를 알아보자 먼저 Brand benz의 코드를 통해 Stack영역에 benz라는 참조 변수를 만들어 두고 new Brand()라는 구문을 통해 Heap영역에 Brand라는 클래스의 인스턴스를 하나 만들어 배치한다.
= 대입 연산자를 통해 Brand라는 클래스의 인스턴스에 즉, 새로운 객체의 주소값을 benz 참조 변수에 할당을 한다.
즉, benz는 주소값만을 가지고 있지 만들어진 Brand객체의 정보를 가지고 있는 것이 아니다.
3. 자바 프로그램의 생명주기
static영역에 클래스가 올라가고 stack에 프로그램의 제어흐름에 따라 main()메서드로 시작하여 안에서 여러가지 메서드 호출 등등 여러가지 로직이 수행이되고 객체 생성이 존재한다면 객체를 Heap영역에 생성을하며 참조 변수에 담아 두게 된다. 객체를 더이상 사용하지 않게 되면 GC(가비지 컬렉터)가 나와서 Heap영역에 연결이 끊긴 객체를 지우게 된다. main() 메서드의 수행이 다 끝나면 main메서드의 닫는 중괄호를 통해 main메서드가 소멸되고 그 후에 static영역의 정보들이 소멸되며 프로그램이 종료된다.
4. 멀티 스레드와 멀티 프로세스
멀티 스레드
하나의 T메모리에서 Stack영역을 스레드 개수만큼 분할해서 사용하는 것이다.
즉, 멀티 스레드는 하나의 T메모리에서 Stack영역을 스레드 개수 만큼 분할해서 사용하므로 static을 공유해서 사용이 가능하며, heap영역 또한 공유가 가능하다는 점이다. 동시성 이슈를 잘 컨트롤 해야하는 단점이 존재한다.
대신에 하나의 T메모리에서 해결이 가능하므로 메모리를 많이 차지하지 않는다.
멀티 프로세스
static영역과 heap영역과 stack영역을 가지는 T메모리를 다수를 가지고 있는 경우이다.
프로세스마다의 static과 heap에 대한 공유를 하지 않으므로 하나의 T영역이 별도로 만들어지는 경우이며,
대신에 메모리를 많이 차지한다는 단점이 존재한다.
# 오늘의 회고
오늘은 JVM과 과제의 예외처리를 학습을 했다. 예외처리에 대해 좀 더 깊숙히 알게 되어서 좋았다.
'내일배움캠프 Spring 5기' 카테고리의 다른 글
내일배움캠프 25일차 TIL - 외래키 (1) | 2024.05.22 |
---|---|
내일배움캠프 24일차 TIL - Generic Static Method (0) | 2024.05.21 |
내일배움캠프 22일차 TIL - Annotation (0) | 2024.05.19 |
내일배움캠프 21일차 TIL - Spring(IoC, DI) (0) | 2024.05.16 |
내일배움캠프 20일차 TIL - Spring(API) (0) | 2024.05.13 |