drrg
224
2019-10-23 14:34:06
4
363

자바 stack메모리와 heap메모리 개념 질문이 있습니다.


java를 공부하면서 메모리 쪽 개념이 약하게 느껴져서 공부하고 있는데,

혹시 다음 코드에 대한 메모리 생성 해석 검토 좀 부탁드립니다. 


public static void main(String[] args) {
  List<Map<Integer,Integer>> testList = new ArrayList<>();
  ===> 1. testList라는 stack 메모리 생성,
  ===> 2. new ArrayList는 heap메모리 생성.
  
  for(int i = 0 ; i <=100; i++) {
  Map<Integer,Integer> testMap = new HashMap<>();

  ===> 3. testMap이라는 stack 메모리 생성,
  ===> 4. new HashMap이라는 heap메모리 생성.


  testMap.put(i, i);
  ===> 5. heap 메모리에 실제 i라는 값이 저장됨.
  ===> 6. stack 메모리인 testMap은 실제 값을 가지고있는 heap 메모리 주소 값을 참조함
  
  testList.add(testMap);
  ===> testList라는 stack 메모리에 testMap이 참조하고 있는 heap 메모리의 실제값을 대입함.
  ===> for문이 끝나면 testMap이라는 stack 메모리 삭제,
  ===> 하지만 heap 메모리의 실제 값은 프로그램이 끝날때까지 유지되어있음.  
 }
  System.out.println(testList);
}


이 코드에 대한 메모리 생성되고 삭제되는 로직을 적어봤는데 아직 개념이 덜잡혀 있기때문에 맞는지 틀린지도 모르겠습니다.

지나가던 고수분들의 조언 부탁드립니다.

0
1
  • 답변 4

  • asd
    16k
    2019-10-23 15:14:58

    List<Map<Integer,Integer>> testList = new ArrayList<>();

    heap에 ArrayList 인스턴스 생성

    stack에 위에서 생성한 ArrayList 인스턴스 레퍼런스 생성


    정도로 가다듬고


    ===> 하지만 heap 메모리의 실제 값은 프로그램이 끝날때까지 유지되어있음. 

    프로그램이 끝날때까지가 아니라 GC가 돌기전까지


    로 정정하면 될거같네요.

    1
  • drrg
    224
    2019-10-23 15:27:38 작성 2019-10-23 15:46:41 수정됨



    답변감사합니다.

    저 한가지 추가 질문이 생겼는데,

    for문에서 testMap에 값을 넣고 testList에 add한후 for문이 끝났을 때,

    레퍼런스인 testMap의 메모리가 삭제되잖아요.


    그러면 testList에 add 된 값은 레퍼런스인 testMap이 삭제됐기때문에, testMap이 참조하고 있던 heap 메모리의 실제 값을 바로 참조하는 건가요?

    아니면, 값을 적재할 때 새로운 heap 메모리가 생성이 되는건가요?

    0
  • asd
    16k
    2019-10-24 10:50:16

    음..이건 저도 좀 더 확인해봐야할것같은데요.

    레퍼런스가 복사돼서 testList안에 들어가고 복사된 레퍼런스를 이용해 testMap이 참조하고있던 heap을 여전히 참조하고있을겁니다.

    1
  • drrg
    224
    2019-10-24 11:25:21

    LichKing

    담변 감사합니다.

    많은 도움이 됐습니다!


    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.