- 응용프로그램이 실행되면, JVM 은 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당받고 JVM은 이 메모리를 용도   에 따라 여러 영역으로 나누어 관리한다.


1. 메서드 영역(Method Area)

- 프로그램 실행 중 어떤 클래스가 사용되면, JVM 은 해당 클래스의 *.class 읽어서 분석하여 클래스에 대한 정보를

  Method Area 에 저장한다. 이 때, 클래스 내의 클래스변수 도 이 영역에 함꼐 생성된다.


2. 힙(Heap)

- 인스턴스가 생성되는 공간.

  프로그램을 실행 중 생성되는 인스턴스 모두 이 곳에 생성된다. 즉, 인스턴스변수(Instance variable)들이 생성되는 공간


3. 호출스택(Call Stack 또는 Execution Stack)

- 호출스택은 메서드의 작업에 필요한 메모리 공간을 제공한다.

  메서드가 호출되면, 호출스택에 호출된 메서드를 위한 메모리가 할당되며, 이 메모리는 메서드가 작업을 수행하는 동안 

  지역변수(매개변수)들과 연산의 중간결과 등을 저장하는데 사용된다. 그리고, 메서드가 작업을 마치게 되면 할당되었던 메모리

  공간은 반환되어 비워진다.

  

  각 메서드별 메모리상의 작업공간은 서로 구별되며, 호출된 메서드는 작업공간에 쌓이게 되는데, 순차적으로 쌓이게 되며,

  젤 최근에 호출된 메서드 작업공간이 가장위에 쌓인다.

  - 언제나 호출스택의 제일 위에 있는 메서드가 현재 실행 중인 메서드이다.

  - 아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드이다.

  


'공부 > JAVA' 카테고리의 다른 글

JAVA_[ Collection.srot (리스트 정렬)]  (0) 2015.03.26
JAVA_[ 제어자 ]  (0) 2015.02.10
JAVA_[Thread join()]  (0) 2015.02.09
JAVA_[Thread start() & run()]  (0) 2015.02.06
JAVA_[ 리눅스 권한변경 ]  (0) 2014.12.26

▶ join()

- 지정된 시간동안 쓰레드가 실행되도록 한다. 지정된 시간이 지나거나 작업이 종료되면, join() 을 호출한 쓰레드로 다시 돌아와

  실행을 계속한다.


- ex (th1 start() 후에 th1.join() 하면 th1 쓰레드가 종료되기전까지 main 메서드가 대기중으로 th2 쓰레드를 실행하지 않고 대기)

public class Thread_Ex14 {


    public static void main(String args[]) {

        ThreadEx14_1 th1 = new ThreadEx14_1();

        ThreadEx14_2 th2 = new ThreadEx14_2();


        th1.start();

        try {

            th1.join();

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

        th2.start();

    }

}


class ThreadEx14_1 extends Thread {

    @Override

    public void run() {

        for (int i = 0; i < 300; i++) {

            System.out.println("-");

        }

    }

}


class ThreadEx14_2 extends Thread {

    @Override

    public void run() {

        for (int i = 0; i < 300; i++) {

            System.out.println("|");

        }

    }

}

'공부 > JAVA' 카테고리의 다른 글

JAVA_[ 제어자 ]  (0) 2015.02.10
JAVA_[ JVM의 메모리구조 ]  (0) 2015.02.10
JAVA_[Thread start() & run()]  (0) 2015.02.06
JAVA_[ 리눅스 권한변경 ]  (0) 2014.12.26
JAVA_[ map의 Key, Value Iterator 으로 자동으로 불러오기 ]  (0) 2014.12.10

● Run()

- run()을 호출하는 것은 생성된 쓰레드를 실행시키는 것이 아니라 단순히 클래스내에 속한 메서드 하나를 호출하는 것이다.


● Start()

- start()는 run()과 달리 쓰레드가 작업을 실행하는데 필요한 호출스택(Call Stack)을 생성한 다음,

  run()을 호출해서, 생성된 호출스택에  run() 이 첫 번째로 저장되게 한다.

 모든 쓰레드는 독립적인 작업을 수행하기 위해 자신만의 호출스택을 필요로 하기 때문에, 새로운 쓰레드를 생성하고 

 실행시킬 때 마다 새로훈 호출스택이 생성되고 쓰레드가 종료되면 작업에 사용된 호출프택은 소멸된다.

1) main 메서드에서 쓰레드의 start 메서드 호출

2) start 메서드는 쓰레드가 작업을 수행하는데 사용될 새로운 호출스택을 생성

3) 생성된 호출스택에 run 메서드를 호출해서 쓰레드가 작업을 수항하도록 한다.

4) 이제는 호출스택이 2개이기 때문에 스케쥴러가 정한 순서에 의해서 변갈아 가면서 실행된다.


※ 결론은 start() 를 쓰는게 확실함.


'공부 > JAVA' 카테고리의 다른 글

JAVA_[ JVM의 메모리구조 ]  (0) 2015.02.10
JAVA_[Thread join()]  (0) 2015.02.09
JAVA_[ 리눅스 권한변경 ]  (0) 2014.12.26
JAVA_[ map의 Key, Value Iterator 으로 자동으로 불러오기 ]  (0) 2014.12.10
JAVA_[ EJB란? ]  (0) 2014.11.05

+ Recent posts