자바 메모리 구조 | 자바 메모리 구조 뿌시기 [ Jvm이란? ] 3271 투표 이 답변

당신은 주제를 찾고 있습니까 “자바 메모리 구조 – 자바 메모리 구조 뿌시기 [ JVM이란? ]“? 다음 카테고리의 웹사이트 https://you.maxfit.vn 에서 귀하의 모든 질문에 답변해 드립니다: https://you.maxfit.vn/blog/. 바로 아래에서 답을 찾을 수 있습니다. 작성자 이정록 이(가) 작성한 기사에는 조회수 13,112회 및 좋아요 369개 개의 좋아요가 있습니다.

자바 메모리 구조 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 자바 메모리 구조 뿌시기 [ JVM이란? ] – 자바 메모리 구조 주제에 대한 세부정보를 참조하세요

자바를 처음 배우려고 하시는 분들,
자바를 사용하고 계시지만 메모리 구조에 대한 감이 안잡히는 분들
도움이 되셨으면 합니다 ^^

자바 메모리 구조 주제에 대한 자세한 내용은 여기를 참조하세요.

자바의 메모리 구조 – velog

자바의 메모리 구조 · Source Code (.java) 파일을 Java Compiler를 통해서 Byte Code(.Class)파일로 변환한다. · JVM이 실행되면서 생기는 공간이다. · new …

+ 여기에 표시

Source: velog.io

Date Published: 12/1/2021

View: 9883

JVM 메모리 구조란? (JAVA) – 느리더라도 꾸준하게

JVM 메모리 구조를 설명하기 전에 JVM이 무엇인지 알아야 합니다. JVM은 Java Virtual Machine의 약자로, 자바 가상 머신이라고 부릅니다.

+ 여기에 보기

Source: steady-coding.tistory.com

Date Published: 12/3/2022

View: 4022

[Java] 자바 JVM 내부 구조와 메모리 구조에 대하여 – 코딩팩토리

1. 자바로 개발된 프로그램을 실행하면 JVM은 OS로부터 메모리를 할당합니다. 2. 자바 컴파일러(javac)가 자바 소스코드(.java)를 자바 바이트코드(.) …

+ 여기에 더 보기

Source: coding-factory.tistory.com

Date Published: 4/3/2021

View: 9836

[Java] JVM 구조와 메모리 영역 – Method, Heap, Stack Area

JVM 동작 과정 JVM은 자바 가상 머신으로, 자바 바이트 코드를 해석하고 실행하는 … [Java] JVM 구조와 메모리 영역 – Method, Heap, Stack Area.

+ 여기를 클릭

Source: tape22.tistory.com

Date Published: 6/29/2022

View: 510

JVM 구조와 자바 런타임 메모리 구조 (자바 애플리케이션이 …

JVM 구조와 자바 런타임 메모리 구조 (자바 애플리케이션이 실행될 때 JVM에서 … 자바 가상 머신으로 자바 바이트 코드를 실행할 수 있는 주체다.

+ 여기에 보기

Source: jeong-pro.tistory.com

Date Published: 4/17/2021

View: 6699

메모리 구조 – 코딩의 시작, TCP School

JVM은 자바 프로그램에서 특정 클래스가 사용되면 해당 클래스의 클래스 파일(*.)를 읽어들여, 해당 클래스에 대한 정보를 메소드 영역에 저장합니다. 힙(heap) 영역.

+ 여기에 자세히 보기

Source: www.tcpschool.com

Date Published: 2/3/2022

View: 3568

[Java] 자바 메모리 구조

JVM 구동방식 (0) 컴파일러에 .java -> . 컴파일 ​(1) 클래스 로더에 의해서 클래스 파일을 메모리 영역에 로드 후 초기화 작업 수행 ​(2) …

+ 자세한 내용은 여기를 클릭하십시오

Source: ljg960730.tistory.com

Date Published: 3/29/2021

View: 8112

JVM 메모리 구조 정리 – 코딩못하는사람

Java Virtual Machine(JVM)이란? java와 운영체제(OS) 사이에서 중계자 역할을 해준다. 자바가 운영체제 종류,플랫폼에 관계없이 독립적으로 실행 …

+ 더 읽기

Source: cantcoding.tistory.com

Date Published: 8/7/2021

View: 1706

[JAVA/자바] 메모리 구조(static, stack, heap) – 네이버 블로그

이번 글은 자바(JAVA)를 사용하는 입장에서 알아야 할 메모리 구조 및 특징에 대해서 알아보려고 한다. 프로그램을 구동하기 위해서 운영체제가 …

+ 여기에 보기

Source: m.blog.naver.com

Date Published: 8/15/2022

View: 1012

[자바 무료 강의] 스레드와 메모리 – 코드라떼

우리는 앞서 자바의 메모리 구조 강의에서 Stack과 Heap, Method Area에 대해서 간략히 배웠습니다. 해당 강의에서는 Thread를 모른 채 하나의 실행 흐름만 생각하며 …

+ 여기에 보기

Source: www.codelatte.io

Date Published: 4/2/2021

View: 9876

주제와 관련된 이미지 자바 메모리 구조

주제와 관련된 더 많은 사진을 참조하십시오 자바 메모리 구조 뿌시기 [ JVM이란? ]. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

자바 메모리 구조 뿌시기 [ JVM이란? ]
자바 메모리 구조 뿌시기 [ JVM이란? ]

주제에 대한 기사 평가 자바 메모리 구조

  • Author: 이정록
  • Views: 조회수 13,112회
  • Likes: 좋아요 369개
  • Date Published: 2019. 9. 25.
  • Video Url link: https://www.youtube.com/watch?v=AWXPnMDZ9I0

JVM 메모리 구조란? (JAVA)

안녕하세요? 코딩 중독입니다.

오늘은 JVM 메모리 구조에 대해 알아보겠습니다.

JVM이란?

JVM 메모리 구조를 설명하기 전에 JVM이 무엇인지 알아야 합니다. JVM은 Java Virtual Machine의 약자로, 자바 가상 머신이라고 부릅니다. 그리고 자바와 운영체제 사이에서 중개자 역할을 수행하며, 자바가 운영체제에 구애 받지 않고 프로그램을 실행할 수 있도록 도와줍니다. 또한, 가비지 컬렉터를 사용한 메모리 관리도 자동으로 수행하며, 다른 하드웨어와 다르게 레지스터 기반이 아닌 스택 기반으로 동작합니다.

아래는 자바 프로그램의 실행 단계입니다.

먼저, 자바 컴파일러에 의해 자바 소스 파일은 바이트 코드로 변환됩니다. 그리고 이러한 바이트 코드를 JVM에서 읽어 들인 다음에, 이것저것 복잡한 과정을 거쳐서 어떤 운영체제든간에 프로그램을 실행할 수 있도록 만드는 것입니다.

만약, 자바 소스 파일은 리눅스에서 만들었고 윈도우에서 이 파일을 실행하고 싶다면, 윈도우용 JVM을 설치만 하면 됩니다. 여기서 JVM은 운영체제에 종속적이라는 특징을 알 수 있습니다.

JVM 메모리 구조

위에서 자바 프로그램의 실행 단계를 아주 간략하게 소개하였는데, JVM의 구체적인 수행 과정은 언급하지 않았습니다. 이제부터는 JVM이 정확히 어떻게 동작을 하고 구조가 어떤지 알아 봅시다.

아래는 자바 프로그램의 실행 단계입니다. 분량상 운영체제 도형은 생략하였습니다. JVM의 구조는 크게 보면, Garbage Collector, Execution Engine, Class Loader, Runtime Data Area로, 4가지로 나눌 수 있습니다.

위에서 설명하였듯이, 자바 소스 파일은 자바 컴파일러에 의해서 바이트 코드 형태인 클래스 파일이 됩니다. 그리고 이 클래스 파일은 클래스 로더가 읽어들이면서 JVM이 수행됩니다.

(1) Class Loader

JVM 내로 클래스 파일을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈입니다. 런타임 시에 동적으로 클래스를 로드합니다.

(2) Execution Engine

클래스 로더를 통해 JVM 내의 Runtime Data Area에 배치된 바이트 코드들을 명렁어 단위로 읽어서 실행합니다. 최초 JVM이 나왔을 당시에는 인터프리터 방식이었기때문에 속도가 느리다는 단점이 있었지만 JIT 컴파일러 방식을 통해 이 점을 보완하였습니다. JIT는 바이트 코드를 어셈블러 같은 네이티브 코드로 바꿈으로써 실행이 빠르지만 역시 변환하는데 비용이 발생하였습니다. 이 같은 이유로 JVM은 모든 코드를 JIT 컴파일러 방식으로 실행하지 않고, 인터프리터 방식을 사용하다가 일정한 기준이 넘어가면 JIT 컴파일러 방식으로 실행합니다.

(3) Garbage Collector

Garbage Collector(GC)는 힙 메모리 영역에 생성된 객체들 중에서 참조되지 않은 객체들을 탐색 후 제거하는 역할을 합니다. 이때, GC가 역할을 하는 시간은 언제인지 정확히 알 수 없습니다.

(4) Runtime Data Area

JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역입니다. 이 영역은 크게 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack로 나눌 수 있습니다.

(1) Method area

모든 쓰레드가 공유하는 메모리 영역입니다. 메소드 영역은 클래스, 인터페이스, 메소드, 필드, Static 변수 등의 바이트 코드를 보관합니다.

2. Heap area

모든 쓰레드가 공유하며, new 키워드로 생성된 객체와 배열이 생성되는 영역입니다. 또한, 메소드 영역에 로드된 클래스만 생성이 가능하고 Garbage Collector가 참조되지 않는 메모리를 확인하고 제거하는 영역입니다.

3. Stack area

메서드 호출 시마다 각각의 스택 프레임(그 메서드만을 위한 공간)이 생성합니다. 그리고 메서드 안에서 사용되는 값들을 저장하고, 호출된 메서드의 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값들을 임시로 저장합니다. 마지막으로, 메서드 수행이 끝나면 프레임별로 삭제합니다.

4. PC Register

쓰레드가 시작될 때 생성되며, 생성될 때마다 생성되는 공간으로 쓰레드마다 하나씩 존재합니다. 쓰레드가 어떤 부분을 무슨 명령으로 실행해야할 지에 대한 기록을 하는 부분으로 현재 수행중인 JVM 명령의 주소를 갖습니다.

5. Native method stack

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

정리

지금까지 간단하게 JVM 메모리 구조를 알아 보았습니다. 사실, 힙은 또 몇 가지의 영역으로 나뉘고 가비지 컬렉터는 어떻게 동작하는지도 알아 보아야합니다. 하지만, 처음부터 모든 내용을 다 다루기에는 무리가 있어서 이렇게 처음에는 겉핥기 식으로 설명을 하고, 추후 각각의 영역에 대해서 깊은 내용을 다루려고 합니다.

참고 자료

[Java] 자바 JVM 내부 구조와 메모리 구조에 대하여

저번 포스팅에서는 JVM에 대해서 간략하게 알아보는 시간을 가졌다면 이번 포스팅에서는 JVM의 내부 구조에 대해 좀 더 자세하게 알아보도록 하겠습니다. 혹시 JVM의 정의와 왜 필요한지 궁금하시다면 아래의 글을 참고하여주세요.

[Java] 자바 가상 머신 JVM(Java Virtual Machine) 총정리

자바 가상 머신(JVM)의 동작 방식

1. 자바로 개발된 프로그램을 실행하면 JVM은 OS로부터 메모리를 할당합니다.

2. 자바 컴파일러(javac)가 자바 소스코드(.java)를 자바 바이트코드(.class)로 컴파일합니다.

3. Class Loader를 통해 JVM Runtime Data Area로 로딩합니다.

4. Runtime Data Area에 로딩 된 .class들은 Execution Engine을 통해 해석합니다.

5. 해석된 바이트 코드는 Runtime Data Area의 각 영역에 배치되어 수행하며 이 과정에서 Execution Engine에 의해 GC의 작동과 스레드 동기화가 이루어집니다.

JVM의 구조

클래스 로더(Class Loader)

자바는 동적으로 클래스를 읽어오므로, 프로그램이 실행 중인 런타임에서야 모든 코드가 자바 가상 머신과 연결됩니다. 이렇게 동적으로 클래스를 로딩해주는 역할을 하는 것이 바로 클래스 로더(class loader)입니다. 자바에서 소스를 작성하면 .java파일이 생성되고 .java소스를 컴파일러가 컴파일하면 .class파일이 생성되는데 클래스 로더는 .class 파일을 묶어서 JVM이 운영체제로부터 할당받은 메모리 영역인 Runtime Data Area로 적재합니다.

실행 엔진(Execution Engine)

앞서 말씀드렸듯 클래스 로더에 의해 JVM으로 로드된 .class 파일(바이트코드)들은 Runtime Data Areas의 Method Area에 배치되는데, 배치된 이후에 JVM은 Method Area의 바이트 코드를 실행 엔진(Execution Engine)에 제공하여, 정의된 내용대로 바이트 코드를 실행시킵니다. 이때, 로드된 바이트코드를 실행하는 런타임 모듈이 실행 엔진(Execution Engine)입니다. 실행 엔진은 바이트코드를 명령어 단위로 읽어서 실행합니다.

가비지 컬렉터(Garbage Collector)

자바 가상 머신은 가비지 컬렉터(garbage collector)를 이용하여 더는 사용하지 않는 메모리를 자동으로 회수해 줍니다. 따라서 개발자가 따로 메모리를 관리하지 않아도 되므로, 더욱 손쉽게 프로그래밍을 할 수 있도록 도와줍니다. Heap 메모리 영역에 생성(적재)된 객체들 중에 참조되지 않은 객체들을 탐색 후 제거하는 역할을 하며 해당 역할을 하는 시간은 정확히 언제인지를 알 수 없습니다. GC역할을 수행하는 스레드를 제외한 나머지 모든 스레드들은 일시정지상태가 됩니다.

※ 가비지 컬렉터에 대해 더 자세히 알고 싶다면 아래 글을 참고해주세요.

[Java] 가비지 컬렉션(GC, Garbage Collection) 총정리

런타임 데이터 영역 (Runtime Data Area)

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

모든 스레드가 공유해서 사용 (GC의 대상)

힙 영역 (Heap Area)

메서드 영역(Method Area)

스레드(Thread) 마다 하나씩 생성

스택 영역(Stack Area)

PC 레지스터 (PC Register)

네이티브 메서드 스택(Native Method Stack)

메서드 영역 (Method Area)

클래스 멤버 변수의 이름, 데이터 타입, 접근 제어자 정보와 같은 각종 필드 정보들과 메서드 정보, 데이터 Type 정보, Constant Pool, static변수, final class 등이 생성되는 영역입니다.

힙 영역 (Heap Area)

1. new 키워드로 생성된 객체와 배열이 생성되는 영역입니다.

2. 주기적으로 GC가 제거하는 영역입니다.

Heap Area는 효율적인 GC를 위해 위와 같이 크게 3가지의 영역으로 나뉘게 됩니다.

Young Generation 영역은 자바 객체가 생성되자마자 저장되고, 생긴지 얼마 안되는 객체가 저장되는 공간입니다. Heap 영역에 객체가 생성되면 최초로 Eden 영역에 할당됩니다. 그리고 이 영역에 데이터가 어느정도 쌓이게 되면 참조정도에 따라 Servivor의 빈 공간으로 이동되거나 회수됩니다.

Young Generation(Eden+Servivor) 영역이 차게 되면 또 참조정도에 따라 Old영역으로 이동 되게 되거나 회수됩니다. 이렇게 Young Generation과 Tenured Generation 에서의 GC를 Minor GC 라고 합니다. Old영역에 할당된 메모리가 허용치를 넘게 되면, Old 영역에 있는 모든 객체들을 검사하여 참조되지 않는 객체들을 한꺼번에 삭제하는 GC가 실행됩니다. 시간이 오래 걸리는 작업이고 이 때 GC를 실행하는 쓰레드를 제외한 모든 스레드는 작업을 멈추게 됩니다. 이를 ‘Stop-the-World’ 라 합니다. 그리고 이렇게 ‘Stop-the-World’가 발생하고 Old영역의 메모리를 회수하는 GC를 Major GC라고 합니다.

스택 영역 (Stack Area)

지역변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값 등이 생성되는 영역입니다.

PC 레지스터 (PC Register)

Thread가 생성될 때마다 생성되는 영역으로 프로그램 카운터, 즉 현재 스레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역입니다.

네이티브 메서드 스택 (Native Method Stack)

1. 자바 이외의 언어(C, C++, 어셈블리 등)로 작성된 네이티브 코드를 실행할 때 사용되는 메모리 영역으로 일반적인 C 스택을 사용합니다.

2. 보통 C/C++ 등의 코드를 수행하기 위한 스택을 말하며 (JNI) 자바 컴파일러에 의해 변환된 자바 바이트 코드를 읽고 해석하는 역할을 하는 것이 자바 인터프리터(interpreter)입니다.

Method, Heap, Stack Area

JVM 동작 과정

JVM은 자바 가상 머신으로, 자바 바이트 코드를 해석하고 실행하는 역할을 합니다. 자바 코드는 JVM을 통해 실행되므로 Window, Linux와 같은 다른 OS에서도 동일하게 실행할 수 있다는 장점이 있습니다.

우아한 테크 JVM 편 캡쳐본

구체적으로 메모리 영역을 공부하기 전에 JVM이 자바 소스코드를 어떻게 OS에서 실행하는지 과정을 살펴봅시다.

1. 자바 소스코드인 .java 파일을 컴파일러가 자바 바이트 코드인 .class로 변환합니다.

2. .class 코드를 JVM의 클래스 로더에게 보냅니다.

3. 클래스 토더는 JVM 런타임 데이터 영역으로 로딩하여 JVM의 메모리에 올립니다.

모든 자바 프로그램은 JVM을 통해 실행됩니다.

일단 프로그램이 실행되면 JVM은 OS로부터 프로그램을 수행하는데 필요한 메모리를 할당받습니다.

이 메모리를 가지고 JVM은 용도에 따라 구분해서 사용합니다.

📂 메모리 영역

Method 영역

static 영역 (== class, method 영역으로도 불림) 은 전역변수나 static으로 선언되는 것들을 메모리에 상주시킵니다.

클래스 정보, static 변수, 변수 정보, 메소드 정보 등을 저장합니다.

패키지나 클래스 정보가 올라갑니다.

static 이 선언된 클래스 멤버도 올라갑니다.

static (전역)변수는 어디든 접근이 가능해지므로 읽기 전용이 아닌 경우는 가능한 사용하지 않습니다.

JVM이 동작해서 클래스가 로딩될 때 생성됩니다.

JVM이 종료될때까지 유지됩니다.

힙 영역

힙 영역은 인스턴스를 생성할 때 생성되는 메모리 형식입니다.

Instance instance = new Instance(); -> heap에 존재

“new”를 사용하여 객체를 만들 때 저장 됩니다.

참조형(class, interface, enum, Array 등) 자료형도 같이 저장됩니다.

힙의 참조 주소는 “스택”이 갖고 있고 해당 객체를 통해서만 힙 영역에 있는 인스턴스를 핸들링할 수 있습니다.

GC가 정리하기 전까지는 남아있습니다.

힙 영역에 저장되는 참조형 타입

스택 영역

스택 영역은 int, long, boolean 등 기본 자료형을 생성할 때 저장하는 공간으로, 임시적으로 사용되는 변수나 정보들이 저장되는 영역입니다.

쓰레드 별로 1개만 생성됩니다.

하나의 쓰레드는 내부적으로 static, stack, heap 영역을 갖게 됩니다.

→ 그래서 A쓰레드는 다른 쓰레드에 접근할 수는 없지만, static과 heap 영역을 공유하여 사용할 수 있습니다.

메소드가 호출될 때마다 생성하고,

메서드 실행이 끝나면 pop되어 제거 됩니다.

📚 참고문헌

자바 메모리 구조 뿌시기 [ JVM이란? ]

JAVA 메모리 – 스태틱(static), 스택(stack), 힙(heap) 이란?

[Java] JVM 메모리 영역

자바(JVM)의 메모리 사용 방식 (T 메모리 구조)

JAVA/ Static, Stack, Heap 메모리 영역의 이해

JAVA에서의 메모리 관리 (Heap, Stack, Static )

[JAVA] Static Keyword 와 Method Area (메소드 영역)

JVM 구조와 자바 런타임 메모리 구조 (자바 애플리케이션이 실행될 때 JVM에서 일어나는 일, 과정을 설명해줄 수 있나요?)

반응형

JVM(Java Virtual Machine)

: 자바 가상 머신으로 자바 바이트 코드를 실행할 수 있는 주체다.

CPU나 운영체제(플랫폼)의 종류와 무관하게 실행이 가능하다.

즉, 운영체제 위에서 동작하는 프로세스로 자바 코드를 컴파일해서 얻은 바이트 코드를 해당 운영체제가 이해할 수 있는 기계어로 바꿔 실행시켜주는 역할 을 한다.

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이 네이티브로 컴파일된 코드를 실행하는 것으로 성능을 높이는 방식이다.

3. Garbage Collector

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

GC가 역할을 하는 시간은 정확히 언제인지를 알 수 없다. (참조가 없어지자마자 해제되는 것을 보장하지 않음)

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

특히 Full GC가 일어나서 수 초간 모든 쓰레드가 정지한다면 장애로 이어지는 치명적인 문제가 생길 수 있는 것이다. (GC와 관련된 내용은 아래 Heap영역 메모리를 설명할 때 더 자세히 알아본다.)

4. Runtime Data Area

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

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

자바 런타임 메모리(Runtime Data area)구조

1. Method area (메소드 영역)

클래스 멤버 변수의 이름, 데이터 타입, 접근 제어자 정보같은 필드 정보와 메소드의 이름, 리턴 타입, 파라미터, 접근 제어자 정보같은 메소드 정보, Type정보(Interface인지 class인지), Constant Pool(상수 풀 : 문자 상수, 타입, 필드, 객체 참조가 저장됨), static 변수, final class 변수등이 생성되는 영역이다.

2. Heap area (힙 영역)

new 키워드로 생성된 객체와 배열이 생성되는 영역이다.

메소드 영역에 로드된 클래스만 생성이 가능하고 Garbage Collector가 참조되지 않는 메모리를 확인하고 제거하는 영역이다.

3. Stack area (스택 영역)

지역 변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값등이 생성되는 영역이다.

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

클래스 Person p = new Person(); 이라는 소스를 작성했다면 Person p는 스택 영역에 생성되고 new로 생성된 Person 클래스의 인스턴스는 힙 영역에 생성된다.

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

메소드를 호출할 때마다 개별적으로 스택이 생성된다.

4. PC Register (PC 레지스터)

Thread(쓰레드)가 생성될 때마다 생성되는 영역으로 Program Counter 즉, 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역이다. (*CPU의 레지스터와 다름)

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

5. Native method stack

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

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

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

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

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

Heap area & Garbage Collector

힙 영역은 좀 더 살펴봐야하는데 그 이유는 GC의 주요 대상이기 때문이다.

(Stack영역과 Method영역도 GC의 대상이 된다)

힙 영역은 우선 5개의 영역(eden, survivor1, survivor2, old, permanent)으로 나뉜다.

-> JDK7까지는 permanent영역이 heap에 존재했습니다. JDK8부터는 permanent 영역은 사라지고 일부가 “meta space 영역”으로 변경되었습니다.(위의 그림 JDK7 기준입니다.) meta space 영역은 Native stack 영역에 포함되었습니다.

(survivor영역의 숫자는 의미없고 두 개로 나뉜다는 것이 중요하다)

힙 영역을 굳이 5개로 나눈 이유는 효율적으로 GC가 일어나게 하기 위함이다. 자세한 것은 GC가 일어나는 프로세스를 보면서 설명한다.

GC는 Minor GC와 Major GC로 나뉜다.

– Minor GC : New 영역에서 일어나는 GC

1. 최초에 객체가 생성되면 Eden영역에 생성된다.

2. Eden영역에 객체가 가득차게 되면 첫 번째 CG가 일어난다.

3. survivor1 영역에 Eden영역의 메모리를 그대로 복사된다. 그리고 survivor1 영역을 제외한 다른 영역의 객체를 제거한다.

4. Eden영역도 가득차고 survivor1영역도 가득차게된다면, Eden영역에 생성된 객체와 survivor1영역에 생성된 객체 중에 참조되고 있는 객체가 있는지 검사한다.

5. 참조 되고있지 않은 객체는 내버려두고 참조되고 있는 객체만 survivor2영역에 복사한다.

6. survivor2영역을 제외한 다른 영역의 객체들을 제거한다.

7. 위의 과정중에 일정 횟수이상 참조되고 있는 객체들을 survivor2에서 Old영역으로 이동시킨다.

– 위 과정을 계속 반복, survivor2영역까지 꽉차기 전에 계속해서 Old로 비움

– Major GC(Full GC) : Old 영역에서 일어나는 GC

1. Old 영역에 있는 모든 객체들을 검사하며 참조되고 있는지 확인한다.

2. 참조되지 않은 객체들을 모아 한 번에 제거한다.

– Minor GC보다 시간이 훨씬 많이 걸리고 실행중에 GC를 제외한 모든 쓰레드가 중지한다.

* Major GC(Full GC)가 일어나면,

Old영역에 있는 참조가 없는 객체들을 표시하고 그 해당 객체들을 모두 제거하게 된다.

그러면서 Heap 메모리 영역에 중간중간 구멍(제거되고 빈 메모리 공간)이 생기는데 이 부분을 없애기 위해 재구성을 하게 된다. (디스크 조각모음처럼 조각난 메모리를 정리함)

따라서 메모리를 옮기고 있는데 다른 쓰레드가 메모리를 사용해버리면 안되기 때문에 모든 쓰레드가 정지하게 되는 것이다.

반응형

코딩교육 티씨피스쿨

메모리 구조

메모리 구조

모든 자바 프로그램은 자바 가상 머신(JVM)을 통해서 실행됩니다.

자바 프로그램이 실행되면, JVM은 운영 체제로부터 해당 프로그램을 수행할 수 있도록 필요한 메모리를 할당받습니다.

이렇게 할당받은 메모리를 JVM은 용도에 따라 다음과 같이 구분하여 관리합니다.

메소드(method) 영역

메소드(method) 영역은 자바 프로그램에서 사용되는 클래스에 대한 정보와 함께 클래스 변수(static variable)가 저장되는 영역입니다.

JVM은 자바 프로그램에서 특정 클래스가 사용되면 해당 클래스의 클래스 파일(*.class)를 읽어들여, 해당 클래스에 대한 정보를 메소드 영역에 저장합니다.

힙(heap) 영역

힙(heap) 영역은 자바 프로그램에서 사용되는 모든 인스턴스 변수가 저장되는 영역입니다.

JVM은 자바 프로그램에서 new 키워드를 사용하여 인스턴스가 생성되면, 해당 인스턴스의 정보를 힙 영역에 저장합니다.

힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당됩니다.

스택(stack) 영역

스택(stack) 영역은 자바 프로그램에서 메소드가 호출될 때 메소드의 스택 프레임이 저장되는 영역입니다.

JVM은 자바 프로그램에서 메소드가 호출되면, 메소드의 호출과 관계되는 지역 변수와 매개변수를 스택 영역에 저장합니다.

이렇게 스택 영역은 메소드의 호출과 함께 할당되며, 메소드의 호출이 완료되면 소멸합니다.

이렇게 스택 영역에 저장되는 메소드의 호출 정보를 스택 프레임(stack frame)이라고 합니다.

스택 영역은 푸시(push) 동작으로 데이터를 저장하고, 팝(pop) 동작으로 데이터를 인출합니다.

이러한 스택은 후입선출(LIFO, Last-In First-Out) 방식에 따라 동작하므로, 가장 늦게 저장된 데이터가 가장 먼저 인출됩니다.

스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당됩니다.

연습문제

[Java] 자바 메모리 구조

반응형

JVM 구동방식

(0) 컴파일러에 .java -> .class 컴파일

​(1) 클래스 로더에 의해서 클래스 파일을 메모리 영역에 로드 후 초기화 작업 수행

​(2) 메모리 영역에 Static(Method)부터 로드가 됩니다

( 클래스 로드가 끝난 후 JVM은 main 메소드를 찾아 지역변수, 객체변수, 참조변수를 스택에 쌓음 )

(4) 로드 후에 JVM이 힙 영역에 객체를 생성합니다

(5) 마지막으로 실행엔진이 .class 파일(바이트코드)을 다양한 메모리를 참조하여 한줄씩 상황에 맞는 작업 수행(함수 호출, 객체 할당 등)

Class Loader: JVM내로 클래스를 로드하고 링크를 통해 배치하는 작업을 수행하는 모듈로써 런타임시 동적으로 클래스를 로드한다.

Execution Engine: Class Loader를 통해 JVM 내의 런타임 데이터 영역에 배치된 바이트 코드를 실행한다. 이 때, Execution Engine은 자바 바이트 코드를 명령어 단위로 읽어서 실행한다.

Garbage Collector: JVM은 Garbage Collector를 통해 메모리 관리 기능을 자동으로 수행한다. 애플리케이션이 생성한 객체의 생존 여부를 판단하여 더 이상 사용되지 않는 객체를 해제하는 방식으로 메모리를 자동 관리한다.

Runtime Data Areas: JVM이 운영체제 위에서 실행되면서 할당받는 메모리 영역이다. Class Loader에서 준비한 데이터들을 보관하는 저장소이다.

Runtime Data Areas

Runtime Data Areas는 Process로서의 JVM 프로그램을 수행하기 위해

OS로 부터 할당 받는 메모리 영역으로

각각의 목적에 따라 5개의 영역으로 나뉜다.

JVM 메모리구조

1. 메소드영역 : 메소드의 바이트코드 , 클래스변수가 저장되는 영역

2. 힙 영역 : 프로그램 실행 중 생성된 객체가 저장되는 영역

3. 스텍 영역 : 메소드 내의 지역변수 , 매개변수(참조형 제외)가 저장되는 영역

4. pc 레지스터 : jvm이 현재 수행할 명령어의 주소가 저장되는 영역

5. Native메소드 스텍 : JAVA어 외의 다른 언어의 메소드에 매개변수 , 지역변수가 저장되는 영역

메소드 영역/런타임 상수 풀의 사용기간 및 스레드 공유 범위

JVM 시작시 생성

프로그램 종료 시까지

명시적으로 null 선언 시

구성 방식이나 GC 방법은 JVM 벤더마다 다를 수 있다.

모든 스레드에서 공유한다.

Method (Static) Area

Method영역, 정적영역이라고 합니다.

JVM이 읽어들인 클래스와 인터페이스 대한 런타임 상수 풀, 멤버 변수(필드), 클래스 변수(Static 변수), 생성자와 메소드를 저장하는 공간이다.

인스턴스를 생성하지 않아도 사용할 수 있습니다.

미리 로드되어 있기에 호출시에 시간이 적게 걸립니다.

할당받는 메모리가 한정되어 있으며 따로 메모리 관리가 되지 않기 때문에​ 남발해서 사용해선 안됩니다.

따라서, static은 사용해야 하는 이유가 있어야 합니다.

Runtime Constant Pool

– 메소드 영역에 포함되지만 독자적 중요성이 있다.

– 클래스 파일 constant_pool 테이블에 해당하는 영역이다.

– 클래스와 인터페이스 상수, 메소드와 필드에 대한 모든 레퍼런스를 저장한다.

– JVM은 런타임 상수 풀을 통해 해당 메소드나 필드의 실제 메모리 상 주소를 찾아 참조한다

Heap 영역

new를 통해 생성한 객체의 정보 (참조값 : Reference Type)이 담깁니다.

JVM이 관리하는 프로그램 상에서 데이터를 저장하기 위해 런타임 시 동적으로 할당하여 사용하는 영역이다.

스레드가 공유하는 영역입니다.

가비지 컬렉터에 의해서 메모리가 관리됩니다.

힙 영역에 생성된 객체와 배열은 스택 영역의 변수나 다른 객체의 필드에서 참조한다.

참조하는 변수나 필드가 없다면 의미 없는 객체가 되어 GC의 대상이 된다.

힙 영역의 사용기간 및 스레드 공유 범위 객체가 더 이상 사용되지 않거나 명시적으로 null 선언 시 GC(Garbage Collection) 대상 구성 방식이나 GC 방법은 JVM 벤더마다 다를 수 있다. 모든 스레드에서 공유한다.

Stack 영역

각 스레드마다 하나씩 존재하며, 스레드가 시작될 때 할당된다.

메소드를 호출할 때마다 프레임(Frame)을 추가(push)하고 메소드가 종료되면 해당 프레임을 제거(pop)하는 동작을 수행한다.

메소드 정보, 지역변수, 매개변수, 연산 중 발생하는 임시 데이터 저장

스레드가 공유하는 영역입니다.

모든 동작이 완료되면 메모리에서 사라집니다.

기본(원시)타입 변수 (int, long, float 등) 는 스택 영역에 직접 값을 가진다.

참조타임 변수는 힙 영역이나 메소드 영역의 객체 주소를 가진다.

​PC Register

현재 수행 중인 JVM 명령 주소를 갖는다.

프로그램 실행은 CPU에서 인스트럭션(Instruction)을 수행.

CPU는 인스트럭션을 수행하는 동안 필요한 정보를 CPU 내 기억장치인 레지스터에 저장한다.

연산 결곽값을 메모리에 전달하기 전 저장하는 CPU 내의 기억장치

Native Method Stack Area

자바 외 언어로 작성된 네이티브 코드를 위한 Stack이다.

즉, JNI(Java Native Interface)를 통해 호출되는 C/C++ 등의 코드를 수행하기 위한 스택이다.

네이티브 메소드의 매개변수, 지역변수 등을 바이트 코드로 저장한다.

출처 :

자바JAVA(6) 자바 메모리 구조(feat. JVM구동방식) – https://hoonmaro.tistory.com

마로의 Java(자바) 정리 – 8. 자바 메모리 구조 – https://blog.naver.com/chlwlstjd10

JVM 메모리 구조 정리

Java Virtual Machine(JVM)이란?

java와 운영체제(OS) 사이에서 중계자 역할을 해준다.

자바가 운영체제 종류,플랫폼에 관계없이 독립적으로 실행 가능하도록 해준다.

메모리 관리를 GC를 통해서 자동으로 해준다.

왜 JVM 메모리 구조를 알아야 할까?

메모리 설계가 잘되어 있는 프로그램에 비해 메모리 고려가 되지 않은 프로그램은 속도 저하 현상이나 튕김 등의 현상이 일어날 확률이 크다.

결과적으로, 같은 기능의 프로그램이라 하여도 메모리의 관리에 따라 성능이 차이가 나게 된다.

따라서 메모리 구조를 파악하고 한정된 메모리를 효율적으로 사용해야 한다.

자바 실행 과정

https://hoonmaro.tistory.com/19

-Java Compiler: Java source(.java)파일을 바이트 코드로 바꿔 .class파일로 만들어 준다.

-Class Loader:만들어진 class파일을 JVM내로 load하고 배치시킨다.

-Execution Engine: 배치된 Byte code를 명령어 단위로 실행한다.

-Garbage Collector: 어플리케이션이 생성한 객체(인스턴스)의 생존여부를 판단해서 더이상 참조되지 않거나 null인 객체의 메모리를 해제시킨다.

-Runtime Data Area: JVM이 실행되면서 할당받은 메모리 공간이다.

Runtime Data Area

https://hoonmaro.tistory.com/19

-Method Area: 클래스,인터페이스에 대한 런타임 상수풀, 메서드, 필드,생성자,타입 정보, static 변수 ,static메서드 ,바이트 코드등을 보관한다. 전체 thread에서 공유할 수 있고, 시작시에 생성되서 종료될 때 까지 존재한다. 따라서 전역변수를 너무 많이 쓰게되면 메모리 초과 위험이 있다.

-Runtime constant pool:각 class,interface는 각각의 런타임 상수풀을 가진다. 상수들은 메서드와 필드,데이터들의 래퍼런스 값을 가지고 있다. 중복되는 정보가 필요하게 되면 런타임 상수풀에서 꺼내서 사용한다. (symbol table)

-Heap Area: 래퍼런스 타입을 갖는 객체(인스턴스),배열 등이 동적으로 생성되서 저장되는 곳이다. new 연산자를 통해 heap영역에 객체를 생성해서 메모리를 부여받고 stack영역에 참조변수에 실제 객체의 레퍼런스 값을 리턴받는다. 이 래퍼런스 값을 통해서만 객체를 다룰 수 있다.

-Stack Area: 각 스레드 시작시에 하나씩 할당되고 종료될 때 해제된다.메소드 호출시에 프레임을 추가하고(push) 종료되면 제거한다(pop). 지역변수, 매개변수, 메서드 정보들의 임시 데이터가 저장된다.

primitive타입 변수는 스택 영역에 직접 값을 가진다.reference 타입의 변수는 힙 영역이나 메소드 영역의 객체 주소를 가진다.

-PC Register:현재 실행중인 JVM 주소를 저장한다.

프로그램 실행은 CPU에서 인스트럭션(Instruction)을 수행.

-Native Method Stack Area:자바 외 언어로 작성된 네이티브 코드를 위한 메모리 stack이다.

Java Native Interface를 통해 호출되는 C/C++등의 코드를 수행하기 위한 스택이다.

위에 3가지 영역은 모든 스레드에서 공유하고 밑 3가지 영역은 각 스레드에서만 사용 할 수 있다.

https://limkydev.tistory.com/51

출처 및 공부한 곳: https://hoonmaro.tistory.com/19 [훈마로의 보물창고] limkydev.tistory.com/51

[JAVA/자바] 메모리 구조(static, stack, heap)

이번 글은 자바(JAVA)를 사용하는 입장에서 알아야 할 메모리 구조 및 특징에 대해서 알아보려고 한다. 프로그램을 구동하기 위해서 운영체제가 메모리(RAM)에 데이터 및 명령어를 저장할 공간을 할당하여 준다. 메모리는 컴퓨터에게 있어 가장 중요한 자산이고 사용할 수 있는 공간이 한정되어 있다. 이러한 것을 어떻게 관리하느냐에 따라서 프로그램의 성능(속도 등)이 좌우된다. 따라서 메모리를 효율적으로 사용하기 위해서는 메모리의 구성과 특징에 대해서 이해할 필요가 있다.

메모리의 공간은 크게 Static(스태틱) 영역, Stack(스택) 영역, Heap(힙) 영역으로 구분되고 데이터타입(자료형)에 따라서 해당 공간에 할당된다.( 기계어 관련 영역은 제외 ) 그러면 메모리의 종류 및 특징에 대해서 하나씩 알아보도록 하자.

[자바 무료 강의] 스레드와 메모리

우리는 앞서 자바의 메모리 구조 강의에서 Stack과 Heap, Method Area에 대해서 간략히 배웠습니다.

해당 강의에서는 Thread를 모른 채 하나의 실행 흐름만 생각하며 배웠었습니다. 이제 Thread와 메모리 구조에 대해서 좀 더 연결해서 배워보는 시간입니다.

이번에는 쉬어가는 강의입니다.

Thread와 메모리 관계를 들어가기 전에 기억이 안날 수도 있으므로 이전에 배웠던 Stack과 Heap, Method Area에 대해 다시 한번 정리하고 시작하겠습니다.

Stack은 Stack Frame 단위로 나누어져 있으며, Thread가 새로운 메서드가 실행되거나 탈출할 때마다 Stack Frame이 생성 및 소멸을 합니다. Stack Frame에는 메서드 내부의 로컬 변수를 관리하는 Local Variables Array와 연산 과정을 일시적으로 저장하는 Operand Stack, 그리고 메서드 종료 시 돌아와야 할 주소나 그 외 메서드에 대한 정보를 가지고 있는 Frame Data로 나뉘어 있습니다.

Heap은 인스턴스 생성 시 인스턴스가 저장되는 메모리 공간입니다. 인스턴스는 참조 여부에 따라 Garbage Collector에 의해 수집 및 소멸되며, 참조 값을 이용하여 인스턴스의 메모리 공간에 접근할 수 있습니다. 문자열 상수를 관리하는 String Constant Pool이 Heap 메모리 공간에 포함되어 있습니다.

Method Area는 클래스 정보, 필드 정보, 메서드에 대한 정보, 인터페이스, 심볼릭 레퍼런스 등 자바 프로그램을 실행시키기 위한 다양한 정보를 가지고 있습니다. 클래스 정적 변수와 클래스 정적 메서드도 Method Area 메모리 공간에 포함되며 상수 관련한 데이터를 가지고 있는 Run-Time Constant Pool도 포함되어 있습니다.

Thread는 Stack을 제외한 Heap 메모리와 Method Area 메모리 공간을 공유합니다.

각 Thread는 자기 자신의 Stack Memory를 가지고 있으며, Thread 끼리 Stack memory 공간을 침범할 수 없습니다.

이 같은 특성을 다시 말하자면 인스턴스 변수나 정적 변수는 Thread가 공유할 수 있으나, 메서드 내의 로컬 변수(지역 변수)는 Thread Stack에서 운용되므로 다른 Thread와 공유할 수 없습니다.

예제 코드

키워드에 대한 정보 자바 메모리 구조

다음은 Bing에서 자바 메모리 구조 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 자바 메모리 구조 뿌시기 [ JVM이란? ]

  • 자바
  • java
  • jvm
  • 자바메모리구조
  • 자바메모리
  • gc
  • 가비지컬렉터
  • 가바지컬렉션

자바 #메모리 #구조 #뿌시기 #[ #JVM이란? #]


YouTube에서 자바 메모리 구조 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 자바 메모리 구조 뿌시기 [ JVM이란? ] | 자바 메모리 구조, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

Leave a Comment