티스토리 뷰
🚀 프로그램이 메모리를 사용하는 방식
하나의 프로그램이 실행될 때 프로그램이 메모리를 사용하는 방식이다.
기계어를 포함한 모든 프로그래밍이 언어의 공통된 메모리 사용방식이며 OOP
에서는 데이터 저장 영역을 다시 3개의 영역으로 나누어
사용한다.
🌠 main() 메소드 : 메소드 스택 프레임
자바가 실행되면 JRE
는 프로그램 내부의 main()
메소드의 유무를 확인하고
이어서 JVM
이 역할을 이어 받아 전저리 과정을 이어간다.
프로그램이 실행되면 JVM
은 실행에 필요한 패키지(ex. java.lang)를 Static 영역
에 저장한다.
그리고 JVM
은 개발자가 작성한 모든 클래스
와 패키지
역시 Static
영역에 저장한다.
☄ main() 메소드가 실행되기 전 JVM에서 수행하는 전처리 작업들
- java.lang 패키지를 T 메모리의 static 영억에 배치한다.
- import 된 패키지를 T 메모리의 static 영역에 배치한다.
- 프로그램 상의 모든 클래스를 T 메모리의 static 영역에 배치한다.
☄ main() 메소드가 실행된 후의 작업들
main()
메소드가 실행되면 클래스 내의 모든 메소드들은 Stack 영역
에 저장된다.
때문에 Stack영역
을 메소드들의 놀이터라고 부르는 것이며
저장이 되었다면 마지막으로 arg인자
를 저장한 변수 공간을 확보해야한다.
최종적으로 모든 Class와 Method를 구성한 저장한 이후에 명령문이 시작하게 되는 것이다.
Heap 영역은 어떻게 사용되는가?
위 그림에서 나오듯 Heap영역
은 객체 즉 Entity
의 저장소이다.
public class Mouse{
public String name;
public int age;
}
public class MouseDriver {
public static void main(String[] args){
Mouse mouse = new Mouse();
mouse.age = 1;
mouse.name = "생쥐";
mouse = null;
}
}
위 코드에 따라 Entity
을 생성하여 new() 생성자로 호출하게 되면
객체 클라스는 Heap영역
에 저장되어진다.
객체 클라스 라면 static영역
에 저장되어야하지 않을까?
라고 한다면 맞는 말이다.
최초 main()
으로 부터 시작되어 패키지 안의 모든 클래스를 저장하게 되는데
만일 개발자가 new()연산자
로 객체를 생성하는 순간
Heap영역
에 저장되게 되는 것이다.
그리고 마지막 mouse
객체가 Null
처리 된다면 GC(가비지 컬렉터)
가 아무도 참조하지 않는 mouse
객체를 비어있는 쓰레기 메모리로 판단하여
삭제하고 Heap 메모리
에서 지워준다.
🌠 멀티 스레드 / 멀티 프로세스의 메모리 영역은 어떻게 나누어 지는가?
☄ 멀티 스레드 의 정의는 스텍 영역을 스레드 개수만큼 분할해서 쓰는 것 이다.
멀티 스레드의 장점은 작업의 병렬처리가 가능하다는 점이지만 static영역
과 Heap영역
을 공유하여 사용할 수 있어
개발자가 두 영역의 데이터를 수정하게 된다면 예상치 못하는 값이 도출 된다.
이것을 스레드 안전정 문제라고 한다.
☄ 멀티 프로세스는 다수의 저장 영역을 생성하는 것 , 즉 다음과 같은 메모리 구조가 된다.
멀티 프로세스는 서로의 메모리를 침범하지 않아 안전성이 높게 평가되지만 반대로 메모리 사용량이 그만큼 커지게 된다.
🧾 Reference
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
내부 클래스와 익명 클래스 차이 (0) | 2022.04.03 |
---|---|
[JAVA] 인터페이스와 추상 클래스의 개념과 정리 (0) | 2022.04.02 |
[JAVA] 자바 프로그램의 개발과 구동 (0) | 2022.03.26 |
[JAVA] 자바가 사용하는 함수형 프로그래밍 람다 (0) | 2022.03.25 |
[JAVA] 스레드의 특성 (0) | 2022.03.24 |
- Total
- Today
- Yesterday
- Algorithm
- C언어
- 그래프
- interview
- ajax
- 면접
- 알고리즘
- 디자인패턴
- java
- docker
- 스프링부트
- 자격증
- security
- 릿코드
- Spring
- springboot
- Solid
- Matlab
- 프로그래머스
- 스프링
- nginx
- spring-cloud
- 매트랩
- 수학
- 백준
- OOP
- 자바
- kakao
- CS
- JPA
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |