[Java] 메모리 구조

szlee·2023년 10월 26일
0

Java

목록 보기
6/23

JDK, JRE, JVM

  • JDK : 자바 개발 도구 - JVM용 소프트웨어 개발 도구
  • JRE : 자바 실행 환경 - JVM용 OS
  • JVM : 자바 가상 기계 - 가상 컴퓨터

프로그램은 개발자가 개발 도구를 이용해 개발하고 운영체제를 통해 물리적인 컴퓨터인 하드웨어 상에서 구동된다.
JDK를 이용해 개발된 프로그램은 JRE에 의해 가상 컴퓨터인 JVM 상에서 구동된다.



프로그램이 메모리를 사용하는 방식 : 코드 실행 영역 + 데이터 저장 영역

객체 지향 프로그래밍의 메모리 사용방식은 이 데이터 저장 영역을 스태틱, 스택, 힙 영역으로 분할해서 사용한다.

  • 스태틱 영역 - 클래스들의 놀이터
  • 스택 영역 - 메서드들의 놀이터
  • 영역 - 객체들의 놀이터



함수와 메서드의 차이?

절차적/구조적 프로그래밍에서는 함수라고, 객체지향에서는 메서드라 부름. (역할 동일)
그러나, 함수와는 다르게 메서드는 무조건 클래스 내에 존재해야 한다.
객체 지향 언어에서 클래스 외부에 존재할 수 있는 것은 없기 때문



프로그램 실행 시 JVM 메모리 영역에서 일어나는 일

main()메서드는 프로그램이 실행되는 시작점.
JREmain()메서드 확인
JREJVM 부팅.

main()메서드 실행 전 JVM이 하는 전처리 과정

  1. JVMjava.lang패키지 스태틱 영역에 가져다 놓음
  • java.lang패키지 : 모든 자바 프로그램이 반드시 포함하게 되는 패키지. 이것이 있기에 System.out.println()같은 메서드 쓸 수 있음.
  1. JVM이 개발자가 작성한 모든 클래스와 임포트 패키지 스태틱 영역에 놓음
  2. main() 메서드를 위한 스택 프레임스택 영역에 할당됨
  • 여는 중괄호를 만날 때마다 스택 프레임이 생기고(클래스 정의 제외) 닫는 중괄호 만나면 해당 스택 프레임 사라짐.
  1. 메서드의 인자를 저장할 변수를 스택 프레임의 맨 밑에 확보.(변수 공간 할당)

main() 메서드가 끝나면 JREJVM을 종료하고 JRE자체도 운영체제 상의 메모리에서 사라진다.

  • 메모리 소멸, JVM 기동 중지, JRE가 사용했던 시스템 자원을 운영체제에 반납

스택 프레임

  • 메서드의 여는 중괄호를 만나면 스택프레임 시작
  • 조건문의 경우 메서드 스택프레임 안에 중첩으로 스택프레임 생성된다.



변수와 메모리

변수는 스태틱, 스택, 힙 영역 중 어디에 있는가?
세 군데 모두에 있다!
각각의 이름도 지역변수, 클래스 멤버변수, 객체 멤버 변수로 다르다.

  • 지역변수 - 스택프레임 안에서 일생을 보낸다. 스택 프레임이 사라지면 함께 사라진다.
  • 클래스 멤버 변수 - 스태틱 영역에서 일생을 보낸다. 스태틱 영역에 한번 자리잡으면 JVM이 종료될때까지 고정된 상태로 그 자리를 지킨다.
  • 객체 멤버 변수 - 에서 일생을 보낸다. 객체와 함께 가비지 컬렉터(힙 메모리 회수기)에 의해 일생을 마친다.

전역변수 static

두 메서드 사이에 값을 전달하는 방법

  • 메서드의 인자 이용
  • 메서드 종료할 때 반환값 넘겨주기
  • 전역변수 사용하기
    • 변수 앞에 static 붙인다. -> 스태틱 영역에 변수 공간이 할당된다.

프로젝트 규모에 따라 코드가 커지면서 여러 메서드에서 전역 변수의 값을 변경하기 시작하면 전역 변수에 저장되어 있는 값을 파악하기 쉽지 않다는 주의점이 있다.



멀티 스레드, 멀티 프로세스

멀티 스레드
: 스택 영역을 스레드 개수만큼 분할해서 쓰는 것.

  • 하나의 메모리를 스택 영역만 분할해서 사용하므로 다른 스레드의 스택 영역은 접근할 수 없으나 스태틱 영역과 힙 영역은 공유해서 사용한다. -> 멀티 프로세스 대비 메모리를 적게 사용할 수 있다.

멀티 프로세스
: 다수의 메모리를 갖는 것.(스태틱, 스택, 힙으로 구성된 메모리 자체를 여러개 쓰는 것)

  • 각자의 메모리가 있고 각자 고유의 공간이므로 서로 참조할 수 없다. -> 메모리 사용량이 크다.






스프링 입문을 위한 자바 객체 지향의 원리와 이해

profile
🌱

0개의 댓글