일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 시크릿 암호화
- 스프링 시큐리티 없이
- mysql multi-row insert
- 로또 등수 코드
- 스프링 소셜 로그인
- android studio
- 스프링 환경변수
- 로또 앱 만들기
- hibe
- springboot
- sops age
- 시크릿 깃에 올리기
- java
- 리사이클러뷰 멀티뷰
- 안드로이드 스튜디오
- oauth 로그인
- spring 채팅방
- jpa dto 매핑
- 스프링 환경변수 설정
- jpa bulk insert
- multiview
- 채팅방 구현
- jpa 최적화
- sops
- Androoid Studio
- sops 암호화
- 로또 등수 알고리즘
- 스프링 오어스
- 쿠버네티스 #fabric8
- 중간 테이블 엔티티 최적화
- Today
- Total
야미의 개발
[JAVA] JAVA 메모리 영역과 구조, static까지 본문
출처
김영한의 실전 자바 - 기본편 강의 - 인프런
실무에 필요한 자바 객체 지향의 핵심 개념을 예제 코드를 통해 쉽게 학습합니다., 국내 개발 분야 누적 수강생 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);
}
}
접근할 때 에는 클래스명.변수명, 클래스명.메소드명()과 같이 사용합니다
위와 같은 코드를 통해 공유할 수 있는 변수를 사용할 수 있습니다.
참고
자바의 메모리 구조
Java의 메모리 구조에 대해서 공부했던 내용을 정리한 글입니다.개인적으로 공부한 자료라 틀린 부분이 있을 수 있습니다.여기, 같은 기능을 하는 두 개의 프로그램이 있다고 가정해보자1) 메모
velog.io
https://tcpschool.com/java/java_array_memory
코딩교육 티씨피스쿨
4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등
tcpschool.com
'JAVA' 카테고리의 다른 글
[JAVA]객체 지향 프로그래밍의 5가지 원칙 (SOLID 원칙) 예시와 개념 (2) | 2024.02.05 |
---|---|
[JAVA] 다형성 - 캐스팅과 메소드오버라이딩 (0) | 2024.01.31 |
[JAVA]접근 제어자 - 개념과 이해 (0) | 2024.01.18 |
[JAVA] 패키지 - 개념, 사용법 정리 (0) | 2024.01.18 |
[JAVA] 상속 (extends)와 구현(implements) 차이 , 다중 상속 (0) | 2024.01.03 |