티스토리 뷰

Java

C, Java의 메모리 구조

살구르 2017. 1. 10. 14:19

1. C

http://dsnight.tistory.com/50

 

-프로그램을 실행시키면 운영체제는 실행시킨 프로그램을 위한 메모리 공간을 할당

-할당되는 메모리 공간은 크게 스택, 힙, 데이터 영역으로 나뉨

-각 메모리 공간은 목적에 따라 할당되는 시점, 장소가 다름

1) 데이터 영역

-전역변수와 static 변수가 할당

-프로그램의 시작과 동시에 할당되고, 프로그램이 종료되어야 메모리에서 소멸

 

2) 스택 영역

-함수 호출 시 생성되는 지역 변수와 매개 변수가 저장

-함수 호출이 완료되면 사라짐

 

 

3) 힙 영역

-필요에 의해 동적으로 메모리를 할당할 때 사용

-배열을 프로그램 런타임에 메모리 크기를 결정하고 싶을 때 동적할당을 통해 힙 영역 할당

 

2. Java

http://ojc.asia/bbs/board.php?bo_table=LecJava&wr_id=520

 

JVM 메모리 모델

 

1) Method 영역

-공유 메모리 영역이라고도 한다.

-클래스의 메소드에 대한 바이트코드, 클래스의 전역변수인 클래스 변수(static) 위치

-JVM에서 실행되고 있는 모든 스레드에 의해 공유

-JVM은 복수개의 스레드가 메소드를 정상적으로 사용하기 위해 동기화기법 제공

-static 필드(클래스 변수)

-각 클래스의 static 필드가 확보

-사용을 위해 클래스 이름으로 호출 시 메모리에 적재

-메서드(바이트 코드)

-메서드의 실행 로직에 대한 바이트 코드가 메모리로 적재되는 공간

-실행 로직이 메모리에 적재되야 cpu가 fetch할 수 있음

-자바의 모든 로직은 메서드에만 존재

-클래스는 필드와 메서드로만 구성되어있기 때문에 메서드에 대한 바이트코드도 static 필드와 마찬가지로 클래스를 객체 생성할 시점에 메모리에 적재(예외 : main())

-장점

  -기동시간의 단축

  -끝까지 사용되지 않는 클래스(필드, 메서드)가 있을 경우 메모리를 절약

  -스택과 같이 필요에 의해 임시적으로 생성되고 사라지는 것이 아니라

  -메서드 영역은 프로그램이 시작할 때부터 끝날 때까지 계속 존재하는 것

  -힙 안의 객체와 같이 실행 시 확보되는 것이 아니라 계속해서 정적으로 존재

 

2) Stack 영역

-메소드가 호출되어 수행 될 때, 매개변수, 지역변수, 리턴 값 등을 저장

-메소드 호출과 함께 메모리 공간 할당, 메소드 수행을 마칠 때 시스템에 반환

-쓰레드에 따라 개별적으로 구성

 

3) Heap 영역

-자바에서 객체를 저장할 때 사용하는 메모리 공간

-new 를 이용하여 생성된 객체 저장

-객체, 배열, String 등 등

 

 

ex)

class Point {
int x, y;
void move(int x, int y) {
this.x = x;
this.y = y;
}
int getX() { return(x); }
int getY() { return(y); }
void setX(int x) { this.x = x; }
void setY(int y) { this.y = y; }
void draw() {
System.out.println( "Point(" + x + "," + y + ")");
}
}

class PointTest {
public static void main(String[] args) {
Point p1, p2 = null;
p1 = new Point();
p1.move(4, 4);
p2 = new Point();
p2.move(2, -4);
}
}

c:>java PointTest

1. JVM은 PointTest 클래스를 메소드 영역에 main의 바이트코드 로드하고 main을 실행

2. main실행시 들어오는 인자 args를 main의 스택에 저장하고 null로 초기화 한다.

3. p1. p2를 스택에 저장하고 p1은 빈값, p2는 null로 초기화 한다.

4. p1 = new Point() 에 의해 Point 객체를 힙에 생성하고 어드레스를 p1 에서 보관
   (스택변수 p1이 메모리 힙의 Point 객체를 참조한다)

5. 메모리힙에 있는 p1이 참조하고 있는 Point객체의 x, y를 4, 4 로 셋팅
    move 메소드가 실행되는 동안 move의 스택영역에 로컬변수 x, y,를 할당하고 4을 대입 후
    인스턴스 변수 x, y에 대입 (this.x = x, this.y=y)
    move 메소드가 끝나면 로컬변수 x, y를 스택에서 해제

6. 이하 동일

'Java' 카테고리의 다른 글

instanceof 연산자  (0) 2017.01.12
String 메서드  (0) 2017.01.12
String 비교  (0) 2017.01.11
다형성(Polymorphism)  (0) 2017.01.11
문자열의 Call by Value 개념  (0) 2017.01.11
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/06   »
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
글 보관함