Language/Java

[JAVA] JVM 메모리 구조

검은 까마귀 2023. 9. 12. 12:28

안녕하시렵니까? 검은까마귀입니다

JVM메모리 구조에 대해 알아보는 시간을 갖겠습니다.


JVM이란 뭘까?


먼저 아주 똑똑한 쳇~ GPT에게 물어보겠습니다 

 

나: JVM에 대해 설명해줘~
JVM은 "Java Virtual Machine"의 약자로, 자바 프로그램을 실행하기 위한 가상 머신입니다. JVM은 자바 프로그램을 컴파일한 바이트 코드를 실행하고, 다양한 운영 체제 및 하드웨어 환경에서 동작하는 역할을 합니다. 아래에서 JVM에 대한 주요 특징과 기능을 설명하겠습니다:

1. 바이트 코드 실행: 자바 소스 코드는 자바 컴파일러를 통해 바이트 코드로 변환됩니다. 이 바이트 코드는 JVM에서 실행됩니다. 이로써, 자바 프로그램은 플랫폼에 독립적이며, 한 번 컴파일한 코드를 여러 운영 체제에서 실행할 수 있습니다.

2. 자동 메모리 관리: JVM은 가비지 컬렉션(Garbage Collection)을 통해 메모리 관리를 자동화합니다. 이는 개발자가 직접 메모리 할당 및 해제를 다룰 필요 없이 메모리 누수와 관련된 문제를 방지합니다.

3. 예외 처리: JVM은 예외 처리를 지원하여 프로그램 실행 중 발생하는 예외와 오류를 처리합니다. 이를 통해 안정성을 높이고 예외 상황을 적절하게 처리할 수 있습니다.

4. 다중 스레드 지원: JVM은 다중 스레드를 지원하며, 자바 언어에서 쉽게 멀티스레딩을 구현할 수 있도록 도와줍니다. 이는 병렬 처리를 효율적으로 수행할 수 있는 장점을 제공합니다.

5. 클래스 로딩 및 동적 로딩: JVM은 클래스 로딩을 관리하며, 필요한 클래스가 필요한 시점에 동적으로 로딩될 수 있습니다. 이것은 자바의 동적 클래스 로딩 및 리플렉션과 관련된 기능을 지원합니다.

6. JIT 컴파일러: JVM은 Just-In-Time (JIT) 컴파일러를 포함하고 있어, 바이트 코드를 실제 기계 코드로 변환하는 과정을 최적화합니다. 이로써 실행 속도를 향상시키며, 프로그램 성능을 최적화합니다.

7. 자바 라이브러리와 API: JVM은 자바 표준 라이브러리와 API를 제공하여 다양한 작업을 수행할 수 있는 기능을 제공합니다. 이러한 라이브러리와 API는 개발 과정을 단순화하고 생산성을 높여줍니다.

JVM은 자바 언어뿐만 아니라 다른 언어에서도 사용될 수 있으며, 이러한 언어들은 자바 가상 머신을 대상으로 컴파일됩니다. 이러한 다양한 언어로 작성된 프로그램은 모두 JVM에서 실행될 수 있어, 플랫폼 독립성과 재사용성을 높일 수 있습니다.

 

호오..... 쏼라쏼라 말이 많은걸 보니 JVM은 생각보다 복잡한거 같습니다

 

일단 저만의 요약을 해보면 이렇습니다.

  • JVM(Java Virtual Machine)
    • 자바프로그램(.java)에서 컴파일한 바이트 코드(.class)를 실행한다. 
    • 가비지 컬렉션을 통해 자동으로 메모리를 관리한다.
    • 예외처리를 지원한다.
    • 병렬처리를 용이하게 하기 위해 다중스레드를 지원한다.
    • 클래스 로딩 및 동적 로딩 가능
    • Just-In-Time (JIT) 컴파일러 기능
    • 자바라이브러리와 API 기능을 가진다

 

아직 모르는 부분이 많군요... 추후 포스팅 소스를 위해 남겨두고

다시 본론으로 들어가서 JVM의 메모리 구조에 대해 알아보겠습니다

 

다시 한번 전지전능하신 GPT의 힘을 빌려!!

나: JVM의 메모리 구조 설명해줘~
Java Virtual Machine (JVM)의 메모리 구조는 다양한 메모리 영역으로 나뉘어져 있으며, 각 영역은 특정 목적을 가지고 있습니다. 아래에서 JVM의 주요 메모리 구조를 설명하겠습니다:

1. 힙 (Heap):
   - 힙은 JVM에서 가장 중요한 메모리 영역 중 하나입니다.
   - 동적으로 생성된 객체 및 배열이 저장되는 곳으로, 힙 영역은 가비지 컬렉션(Garbage Collection)에 의해 관리됩니다.
   - 힙은 Young Generation과 Old Generation 두 부분으로 나뉩니다. Young Generation은 새로 생성된 객체를 위한 영역이며, Old Generation은 오랜 시간 동안 살아남은 객체를 위한 영역입니다.

2. 메서드 영역 (Method Area 또는 PermGen - Permanent Generation):
   - 메서드 영역은 클래스 파일과 메서드의 바이트 코드, 정적 변수(static variables), 상수(Constant Pool) 등의 정보를 저장합니다.
   - Java 7 이전에는 PermGen이라고 불렸지만, Java 8 이후부터는 PermGen 대신 Metaspace로 대체되었습니다.

3. 스택 (Stack):
   - 스택은 각 스레드마다 별도로 생성되며, 메서드 호출과 관련된 로컬 변수, 메서드 매개변수, 호출 스택 정보 등을 저장합니다.
   - 스택은 호출된 메서드의 실행이 끝나면 해당 메서드의 스택 프레임을 제거하므로, 메모리 관리가 상대적으로 간단합니다.

4. PC 레지스터 (Program Counter Register):
   - PC 레지스터는 현재 실행 중인 스레드의 명령어 주소를 가리킵니다.
   - 스레드가 다음에 실행할 명령어를 가리키며, 명령어를 순차적으로 실행합니다.

5. 네이티브 메서드 스택 (Native Method Stack):
   - 네이티브 메서드 스택은 Java 언어 이외의 네이티브 코드 (예: C, C++ 등)에서 호출되는 네이티브 메서드에 관련된 정보를 저장합니다.
   - 일반적으로 Java 언어로 작성된 프로그램에서는 사용되지 않습니다.

6. 다이렉트 메모리 (Direct Memory):
   - 다이렉트 메모리는 Java의 NIO(Non-blocking I/O)에서 사용되며, JVM 힙 영역 외부에 직접 메모리를 할당합니다.
   - 주로 네트워크 통신 또는 파일 입출력(IO) 작업에서 사용됩니다.

이러한 메모리 구조는 Java 애플리케이션의 실행과 메모리 관리를 지원하기 위해 사용됩니다. JVM은 메모리 관리, 가비지 컬렉션, 스레드 관리 등을 효율적으로 수행하여 안정적이고 효율적인 자바 애플리케이션 실행을 보장합니다.

 

 

아래의 그림은 글로는 이해가 안되서 저를 위해 제가 준비해보았습니다

https://www.devkuma.com/docs/jvm/memory-structure/

 

 

 

공부할게 아주 많군요

과거에 스프링을 배포할때 힙역역 설정 때문에 프로세스를 죽여버린 경험이 있는데

이번 기회에 많은걸 얻어가보도록 하겠습니다.

 

힙영역은 동적으로 생성된 객체 및 배열이 저장되는 곳 이라고 합니다

그때는 얼마나 제가 객체 및 배열을 생각없이 생성했는지는 모르겠지만

다음 프로젝트때는 꼭 측정해보겠습니다

 

 

그렇다면 저희는 개발자니깐 과연 코드를 작성할때 JVM 데이터 구조를 어떻게 다뤄야 할까요??

  1. 메모리 관리
    • 불필요한 객체 참조를 피한다!
    • 객체를 적절하게 소멸시켜야한다!
    • 큰 메모리 요구 사항이 있는 어플리케이션의 경우, 힙 크기 조정 옵션을 고려해야한다!
  2. 자원해제
    • 외부 리소스의 해제!
    • finally, close()를 활용한다!

암무튼! JVM에서 프로세서가  뻑 안나게 할려면 JVM의 구조를 알아야하고

효율적인 메모리 관리를 위해서 객체를 적절하게 참조하고 불필요한 객체는 소멸시켜야한다

 

 

오늘은 JVM 찍먹JVM의 메모리 구조에 대해서 알아봤습니다.

다음부터는 메모리관리를 잘해서 프로세스를 안 죽여보도록 해보겠습니다.

반응형

'Language > Java' 카테고리의 다른 글

[JAVA] Gabage Collection (1)🗑️  (1) 2024.04.09
[JAVA] 상속 👨‍👩‍👧‍👦  (2) 2023.09.12
[JAVA] Thread 활용법  (0) 2022.01.14
[JAVA] Collection FrameWork  (0) 2022.01.12
[JAVA] 제네릭(Generic)  (0) 2022.01.10