-
[Java] 쓰레드 스택, 힙 영역, 쓰레드 로컬JAVA 2024. 11. 24. 20:48728x90
쓰레드 동시성 공부를 하면서 쓰레드 로컬과 스택, 힙 영역의 차이가 궁금하여 정리해보았다.
쓰레드 스택
스택영역은 각가의 쓰레드 가지는 별도의 메모리 공간이다.
쓰레드가 생성되면 스택 영역을 부여 받고, 실행시 run() 메서드가 스택 영역에 쌓이게 된다.스택에는 쓰레드가 메서드를 실행할 때 메서드 프레임이라는 형태로 쌓이게 되는데,
이 메서드 프레임에는 호출한 메서드를 가지고 있는 인스턴스의 주소값과 메서드에서 사용되는 지역변수가 저장된다.
쓰레드 간에 지역변수는 절대로 공유되지 않는다!호출한 메서드를 가지고 있는 인스턴스의 주소값? 이 무엇일까?
이 부분이 헷갈렸는데, 예시를 들어 살펴보자.// MyRunnable 은 Runnable의 구현체이다 Thread t1 = new Thread(new MyRunnable(), "th-1"); t1.start();
t1의 호출스택에는 MyRunnable 객체의 run() 메서드 프레임이 쌓이게 되고,
메서드 프레임에는 run() 메서드의 MyRunnable 객체의 주소값도 함께 저장된다.지역변수만을 사용하는 메서드인 경우 동시성 문제를 고려하지 않아도 된다.
단, 클래스 변수나 멤버 변수를 사용하는 경우 동시성 문제를 고려해야한다.스택 호출이 완료되면 스택에서 저장했던 변수들은 소멸되고, 이전 스택을 실행하게 된다.
힙 영역
힙 영역은 모든 쓰레드에서 공통으로 사용되고 동적으로 할당되는 영역이다.new 생성자를 통해 동적으로 힙 영역에 생성되고, 주로 인스턴스나 배열이 저장된다.
생성된 데이터를 더 이상 참조하는 곳이 없으면 GC에 의해 자동으로 소멸된다.스택은 쓰레드 별로 관리하지만, 힙은 쓰레드와 상관없이 하나의 영역에서 관리한다는 점이 다르다.
쓰레드 로컬
쓰레드 로컬은 쓰레드가 가지는 별도의 저장공간이다.
쓰레드 로컬과 스택과 다른점이 무엇일까?쓰레드도 하나의 인스턴스로 관리가 되는데, 쓰레드 별로 각각 쓰레드 로컬을 참조하고 있다.
쓰레드 로컬은 내부에 Map 과 유사한 자료구조를 가지고 있는데, 이 인스턴스를 쓰레드가 참조하고 있는 것이다.즉 쓰레드 별로 쓰레드 로컬을 가지고 있고,
각각의 쓰레드 로컬 인스턴스는 힙영역에 저장되어 있으며,
쓰레드 로컬에 데이터를 저장하게 되면 마찬가지로 힙 영역에 저장되게 된다.728x90728x90'JAVA' 카테고리의 다른 글
[Java] Apache Poi 파워포인트 표 만들기 (0) 2022.11.21 ArrayList에서 Optional 객체 찾기, filter 조건 걸기, 배열에서 filter 조건걸기 (0) 2021.12.01 String으로 저장된 날짜를 Date 형식으로 변환하여 DB에 저장하기 (0) 2021.09.14 JAVA apache poi - PowerPoint 읽고 새로운 PowerPoint 생성 (0) 2021.07.02