야미의 개발

[JAVA] JAVA 메모리 영역과 구조, static까지 본문

JAVA

[JAVA] JAVA 메모리 영역과 구조, static까지

채야미 2024. 1. 18. 17:35

출처 

https://www.inflearn.com/course/%EA%B9%80%EC%98%81%ED%95%9C%EC%9D%98-%EC%8B%A4%EC%A0%84-%EC%9E%90%EB%B0%94-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard

 

김영한의 실전 자바 - 기본편 강의 - 인프런

실무에 필요한 자바 객체 지향의 핵심 개념을 예제 코드를 통해 쉽게 학습합니다., 국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 실전 자바[사진][임베딩 영상]단순히 자바 문법을 안다

www.inflearn.com

 

본 내용은 김영한님의 실전 자바 강의를 보고 정리한 내용입니다 자세한 내용은 강의를 참고해주세요!

 

 

자바의 메모리 구조 이해하기

자바 프로그램이 실행되면 JVM(자바 가상머신 - JAVA virtual machine)이 OS로 부터 메모리를 할당받고 

그 메모리를 여러 영역으로 나누어 관리합니다.

 

JVM머신이란?

자바와 운영체제 사이에서 중개자 역할을 수행하며, 자바가 운영체제에 구애 받지 않고 프로그램을 실행할 수 있도록 도와줍니다. 또한, 가비지 컬렉터를 사용한 메모리 관리도 자동으로 수행하며, 다른 하드웨어와 다르게 레지스터 기반이 아닌 스택 기반으로 동작합니다.

 

JVM의 구조

 

  • Source Code (.java) 파일을 Java Compiler를 통해서 Byte Code(.Class)파일로 변환한다. (컴퓨터가 이해할 수 있는 코드로 변환)
  • Byte Code로 변환된 파일을 JVM의 Class Loader 로 보낸다.
  • Class Loader는 말 그대로 Class 파일을 불러와서 메모리에 저장하는 역할을 한다.
  • Execution Engine 은 Class Loader에 저장된 Byte Code를 명령어 단위로 분류하여 하나씩 실행하게 하는 엔진이다.
  • Garbage Collector 는 사용하지 않거나 필요없는 객체들을 메모리에서 소멸시키는 역할을 한다.
  • Runtime Data Area (Memory Area) 는 JVM이 프로그램을 수행하기위해 운영체제로부터 할당받은 메모리 공간이다.

 

자바의 메모리 구조

 

한편 위의 그림에서 자바의 메모리 영역(Runtime Data Area)인은 메서드 영역, 스택 영역, 힙 영역 3가지로 나눌 수 있습니다.

 

  • 메서드 영역: 클래스 정보를 보관한다. static 변수 및 런타임 상수 풀 보관
  • 스택 영역: 실제 프로그램이 실행되는 영역.
    메서드를 실행할 때 마다 하나씩 쌓인다.
    JVM은 자바 프로그램에서 메소드가 호출되면, 메소드의 호출과 관계되는 지역 변수와 매개변수를 스택 영역에 저장합니다.
  • 힙 영역: 객체(인스턴스)가 생성되는 영역이다.
    new 명령어를 사용하면 이 영역을 사용한다. 참고로 배열도 이 영역에 생성된다. JVM은 자바 프로그램에서 new 키워드를 사용하여 인스턴스가 생성되면, 해당 인스턴스의 정보를 힙 영역에 저장합니다.

 

 

공유변수의 필요성

한편 도서판매 프로젝트에서 Book이라는 객체의 갯수를 세고싶다고 가정해봅니다.

Book이라는 객체(인스턴스)안에 있는 변수들은 

따로 힙(Heap)영역에 올라가게 되고 이 변수들은 서로 공유되지 않으므로

-> 공유할 수 있는 변수 static 가 필요합니다

 

 

 

static

static 변수는 정적변수라고도 하며 정적멤버(정적 메소드, 정적 필드)를 선언할 수 있게 합니다.

이들은 객체(인스턴스 - 힙에 저장)에 포함된 것이 아니라 클래스에 고정된 멤버입니다

따라서 클래스가 로딩될때 메서드 영역에서 관리됩니다.

 

static의 사용

public class Data3 {
	public String name;
 	public static int count; //static
}

위와 같이 클래스나 변수의 접근 제어자 다음에 표기해 줍니다

 

package book;
public class BookMain {
 	public static void main(String[] args) {
 		int bookNum = Book.count;
 		System.out.println("Number of Books =" + bookNum);
	}
}

접근할 때 에는 클래스명.변수명, 클래스명.메소드명()과 같이 사용합니다

위와 같은 코드를 통해 공유할 수 있는 변수를 사용할 수 있습니다.

 

 

 

참고

https://velog.io/@shin_stealer/%EC%9E%90%EB%B0%94%EC%9D%98-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0

 

자바의 메모리 구조

Java의 메모리 구조에 대해서 공부했던 내용을 정리한 글입니다.개인적으로 공부한 자료라 틀린 부분이 있을 수 있습니다.여기, 같은 기능을 하는 두 개의 프로그램이 있다고 가정해보자1) 메모

velog.io

https://tcpschool.com/java/java_array_memory

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

 

Comments