일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- linux시간으로 변경
- gcc 업데이트
- 정규식 컴파일
- regex_search
- grafana dashboard
- c3 step graph
- 정규식 문자열 출력
- InfluxDB
- c3 축 없애기
- telegraf
- c3 초
- python popen
- CentOS7
- 1697
- snmp
- c++ 정규식
- 백준
- gcc regex
- python os
- 정규식 활용
- c3 축 가리기
- centos pyhon 설치
- semanage
- g++ 업데이트
- snmp test
- c3 second
- python subprocess
- selinux port 등록
- influxdb 설치
- subporcess path
- Today
- Total
리셋 되지 말자
2일차-데이터 저장 영역의 동작 본문
T메모리 구조
- 위의 구조를 상기한 상태로 예제를 통해 T메모리가 어떻게 동작하는지 확인해본다.
메서드 스택 프레임
main() 메서드는 프로그램이 실행되는 시작점이다. 아래의 예제 코드를 예시로 T 메모리가 어떻게 동작하는지 살펴본다.
public class Start {
public static void main(String[] args) {
System.out.println("Hello OOP!!!");
}
}
동작 순서
- JRE가 프로그램안에 main() 메서드가 있는지 확인
-> JRE가 Start 클래스에서 main() 메서드를 발견 - main() 메서드가 확인되면 JVM에 전원을 넣어 부팅 시작
- 부팅된 JVM은 목적 파일(.class)을 받아 그 목적 파일을 실행
- java.lang 패캐지를 T메모리의 스태틱(static)영역에 올린다.
-> java.lang 패키지는 모든 java 프로그램이 반드시 포함하게 되는 패키지이다. (이 패키지로 인해 System.out.println 같은 메서드를 쓸 수 있다.
- JVM이 개발자가 작성한 모든 클래스와 import 패키지를 스태틱(static)영역에 올린다.
-> 위의 코드에서는 클래스가 Start 뿐이니 T메모리에 Start 패키지가 올라간다. 이래서 스태틱(static)영역을 클래스 영역이라고 하였음.
- 여기까지의 과정을 '전처리 과정'이라고 한다. 스태틱(static) 영역에 클래스가 올라가니 '클래스 영역'이라고도 한다.
- main() 메서드의 스택 프레임이 스택(stack)영역에 할당된다.
-> '클래스 정의를 시작하는 여는 중괄호'를 제외한 '여는 중괄호'를 만날 때마다 스택 프레임이 하나씩 할당된다.
- main() 메서드의 인자 args를 저장할 변수 공간을 main() 메서드의 스택 프레임의 맨 밑에 확보한다
-> 메서드 인자의 변수 공간을 할당
-
main() 메서드 안의 첫 명령문을 실행
-> main() 함수의 System.out.println("Hello OOP!!!"); 이 실행됨.(System.out.println() 구문이 코드 실행 공간에서 실행되면 GPU에 화면 출력을 의뢰한다. 이때는 T 메모리의 변화가 없다.) -
모든 명령문이 끝나고 메서드의 끝을 나타내는 '닫는 중괄호'를 만나면 스택 프레임이 소멸된다.
-> main() 메서드의 스택 프레임이 소멸된다.
- main() 메서드가 끝나면 JRE는 JVM을 종료하고 JRE 자체도 운영체제 상의 메모리에서 사라진다.
-> 이때 T 메모리도 전부 사라짐
예시1
public class Start2 {
public static void main(String[] args) {
int i;
i = 10;
double d = 20.0;
}
}
- java.lang 패키지, Start2 패키지와 main() 스택 프레임, args가 올라간다.
1. 변수 i를 위한 공간이 main() 스택 프레임 안에 할당된다.
-> 3번째 줄까지 실행되었다면 초기화가 되어 있지 않으므로 변수 i에 쓰레기 값이 들어있다. ?로 표시하도록 한다.
2. 변수 i에 값이 할당된다.
-> 4번째 줄에서 변수 i에 값 10이 할당된다.
3. 변수 d가 main() 스택 프레임에 생성되고 값 20.0이 할당된다.
-> 6번째 줄에 선언문과 할당문이 한 줄에 있지만, 선언이 된 후 할당이 된다. 동시에 일어나지는 않는다.
4. main()메서드가 닫는 중괄호를 만나서 종료되므로 main()스택 프레임이 스택 영역에서 사라지고 프로그램이 종료된다.
예시2 - 블록 구문( if ) : 블록 스택 프레임
public class Start3 {
public static void main(String[] args) {
int i = 10;
int k = 20;
if(i==10){
int m = k+5;
k = m;
}else{
int p = k + 10;
k = p;
}
//k = m + p;
}
}
- 5번째 줄까지 끝났을 때의 메모리 상황은 아래와 같다.
1. if 구문의 조건에 따라 분기가 발생한다. 여는 중괄호를 만나서 'if 스택 프레임'이 생성된다.
-> i가 10, 참이므로 윗 블록이 실행되어 'if(true) 스택 프레임'이 main() 스택 프레임 내부에 생성된다.
2. int m = k + 5 명령이 실행되므로, if(true) 스택 프레임 안에 변수가 생성된 후, k + 5 값이 대입된다.
-> 한 줄에 있지만, 선언과 연산으로 이루어진 명령이다.
3. k = m 명령이 실행되어 k의 값이 m의 값으로 변경된다.
4. 9번째 줄의 '닫는 중괄호'를 만나면 스택 프레임이 사라진다.
-> if(true) 스택 프레임 안에 있던 변수 m도 같이 사라진다. else문은 무시된다.
5. k = m + p 명령이 주석처리가 되어있는데, 주석처리 하지 않으면 오류가 발생한다. m이라는 변수는 if(true) 스택 프레임안에 존재했는데 사라졌기 때문이다.
6. main() 메서드 스택프레임이 사라지므로 T 메모리가 소멸, JVM 정지, JRE가 사용했던 시스템 자원을 운영체제에 반납하게 된다.
변수와 T메모리
- 변수는 T 메모리 세 구역 스태틱 영역, 스택 영역, 힙 영역에 모두 존재한다.
- 클래스 멤버 변수 : 스태틱 영역에 한번 자리를 잡으면 JVM이 종료될 때까지 스태틱 영역에 존재한다.
- 지역 변수 : 스택 영역의 스택 프레임 안에 존재한다. 스택 프레임이 사라지면 지역 변수도 같이 사라진다.
- 객체 멤버 변수 : 객체와 함께 가비지 컬렉터라고 하는 메모리 회수기에 의해 일생을 마치게 된다.
메서스 스택 프레임
-
main() 메서드 외에 다른 메서드가 있을 경우에 T 메모리가 어떻게 동작하는지 예시로 확인해본다.
public class Start4 { public static void main(String[] args){ int k=5; int m; m=square(k); } private static int square(int k){ int result; k=25; result=k; return result; } }
- 5번째 줄까지 실행 되었을 때의 T 메모리의 모습은 아래와 같다.
2. 6번째 줄에서 square(k)를 만나므로 9번째 줄로 이동한다. 이때 매개변수가 존재한다.
-> 메서드 호출이 일어나면 무조건 호출되는 메서드의 스택 프레임이 T 메모리 스택(stack)영역에 새롭게 생성된다. 즉 square() 메서드의 스택 프레임이 생성된다. 이때, 반환값을 저장할 변수 공간이 맨 아래, 그 위에 인자에 대한 변수 공간, 그리고 메서드의 지역 변수가 자리잡게 된다.
-> main() 스택 프레임의 k와 square() 스택 프레임의 k는 이름만 같지 전혀 다른 변수 공간이다. 이를 call by value라고 한다.
3. 14번째 줄까지 실행되면 아래와 같이 result와 k에 값이 정해진다. 그리고 16번째 줄까지 실행되면, 반환값에 result 변수에 담긴 값이 복사된다.
4. 17번째 줄에서 square() 메서드의 닫는 괄호를 만나면 square() 스택 프레임이 사라진다. 이때, square() 스택프레임은 반환값이 있으니 그 값을 돌려주면서 스택영역에서 사라진다.
-> 6번째 줄의 m에 반환값을 돌려주므로 아래와 같이 T 메모리의 상태로 변경된다.
5. main() 메서드의 끝을 알리는 닫는 괄호를 만나서 main() 스택 프레임이 사라지고, 프로그램이 종료된다.
'Java(폐지) > Java 공부' 카테고리의 다른 글
상속 (0) | 2020.07.16 |
---|---|
5일차-클래스 멤버 vs 객체 멤버 = static 멤버 vs 인스턴스 멤버 (0) | 2020.07.15 |
4일차 - 자바와 객체 지향 (0) | 2020.07.14 |
3일차 (0) | 2020.07.14 |
1일차-스프링 입문을 위한 자바 객체지향의 원리와 이해 (0) | 2020.07.11 |