일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 테스트
- ㅔㄴ션
- WeNews
- 네이티브쿼리
- Query
- MySQL
- 서브쿼리
- foreignkey
- 커밋메세지수정
- querydsl
- ubuntu
- 컨테이너실행
- subquery
- docker명령어
- 메세지수정
- 2 > /dev/null
- appspec.yml
- 검색
- AuthenticationEntryPoint
- 포트
- 적용우선순위
- 메소드명
- appspec
- 예약
- EC2
- 추후정리
- 테스트메소드
- 외부키
- 참조키
- application.yml
Archives
- Today
- Total
제뉴어리의 모든것
[Section1] [Java] 심화(Effective) - JVM 본문
JVM이란
Java프로그램과 OS간에 중간 매개체 역할을 하는 프로그램.
JAVA 코드 내용을 OS에 맞게 알아서 번역하여 주는 프로그램인것이다.
쉽게 설명하자면,
Java 프로그램에서 컴퓨터의 마이크 기능을 사용하기 위해 os에게 요청을 할 수가 있다.
그럴 경우, os마다 그 요청을 들어주기 위해 Java 프로그램에게 요청하는 것들이 다 다를수가 있다.
그런것을 개발자가 일일히 코드로 넣지 않아도, 그냥 "마이크 기능 요청" 이란 코드만 들어가면 JVM이 알아서 OS에서 요청한것들을 제출하는것이다.
그래서 OS마다 전용 JVM이 존재한다.
JVM 구조
위에 내용을 설명하자면,
1. .java 파일을 컴파일러가 컴파일하여 .class 파일을 만든다.
2. JVM이 코드를 작동시키기 위해 필요한 메모리를 OS로부터 할당받는다. (그 영역이 Runtime Data Area)
3. Class Loader가 .class(바이트코드) 파일의 내용을 JVM내부로 불러와 Runtime Data Area에 적재 시킨다.
4. 3번의 과정이 완료되면 Execution Engine이 Runtime Data Area 영역의 코드를 실행 시킨다.
5. Interpreter와 JIT compiler를 이용하여 코드를 기계어로 번역하여 실행시킨다.
기본적으로 Interpreter로 코드를 읽다가 중복되는 코드들이 많으면 해당 코드를 JIT compiler를 이용하여 번역함.
- Interpreter : 바이트 코드를 한줄한줄 번역
- JIT compiler : 바이트 코드 전체를 통째로 번역
JVM의 메모리 영역
- Stack 영역 (스레드마다 하다씩 가지는 스레드의 고유한 메모리 영역)
Stack은 자료구조의 중에 하나이다.
즉, 자료를 저장하는 방식을 나타낸다.
그러므로 Stack 영역은 Stack방식으로 데이터를 저장하는데, 선입후출이다.
먼저 들어 온 것이 나중에 나간다.
JAVA로 만든 프로그램이 하나 있다고 했을때,
해당 프로그램에서 A라는 메소드를 호출 했을때, 그 안에는 선언된 지역변수들이 있을것이다.
그 지역변수들은 기본타입일수도 있고, 참조타입일수도 있다.
그리고 Stack 메모리 영역에는 A메소드(내부에 선언된 지역변수들 포함) 가 적재된다.
그리고 A메소드내에서 B라는 메소드를 호출했다면,
Stack 영역의 A메소드 위에 B메소드가 적재된다.
그리고 B메소드가 종료되면 Stack 메모리에서 B메소드는 삭제된다.
그리고 A메소드마저 종료되면 A메소드 또한 Stack 메모리에서 삭제된다.
- Heap 영역
JVM에 단 하나만 존재하는 영역으로써 JVM이 실행되면 자동으로 해당 영역이 생성된다.
해당 영역에는 실제 객체, 배열의 실제 데이터 공간, 객체의 인스턴스 변수(기본값일 경우 해당 값 자체가 저장, 참조값일 경우 주소값을 저장) 를 저장한다.
new 키워드(해당 클래스의 객체를 만들어 Heap메모리에 적재하는 기능)를 사용하여 생성된 객체들이 적재되는 영역.
그리고 객체마다 고유한 속성인 인스턴스 변수들의 값이 객체라는 틀안에 저장된다.
- 멤버 중 인스턴스 변수는 해당값을 heap 영역에 가지고 있지만, 스태틱 변수는 실제값을 static 영역에 가지고 있다.
- 실제 메소드들은 모두 힙영역에 존재하지 않는다.(static이 아니여도) 왜냐하면 어차피 로직의 내용은 같기 때문에
실제 메소드 내용은 static 영역에서 가지고 heap 영역에서는 해당 메소드의 정보를 가지고 있는 메모리 영역의 주소값만 가지고 있다.
'코드스테이츠 > 정리 블로깅' 카테고리의 다른 글
[Section2][자료구조/알고리즘] 자료구조 - Tree (0) | 2022.07.26 |
---|---|
[Section2][자료구조/알고리즘] 자료구조 - Stack, Queue (0) | 2022.07.25 |
[Section1][Java] 심화 - 애너테이션 (0) | 2022.07.24 |
[Section2] [자료구조-알고리즘] - 재귀 (0) | 2022.07.21 |
[Section1][Java] 심화 - 람다 (0) | 2022.07.20 |