ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 20220908 TIL 다 이유가 있다.
    TIL 2022. 9. 8. 23:30


    메가테라 첫 주차에 마주쳤던 JVM.
    이제서야 메모리 구조를 외울 수 있게 되었다.
    JVM을 처음 마주쳤을 때 들었던 감정은... 매우 복잡했다.
    이게 다 뭣인가.

    런타임 메모리 영역은 심지어 5개로 나뉘어진다.
    처음에는 낯설고 낯선 용어 밖에 없어서 이게 다 뭔가 싶었지만 공부를 하다보니
    하나하나 없어선 안 될 하나하나 소중한 곳들이었다.
    이 복잡한 구조는 어떻게 하면 조금이라도 메모리의 낭비를 막을지 고민한 흔적의 결과였다.

    https://www.google.com/imgres?imgurl=https%3A%2F%2Fjjal.today%2Fdata%2Ffile%2Fgallery%2F2950630335_SnlH7EJQ_e5f8a07da8bb403e332a45f84966220f8e91aa37.jpg&imgrefurl=https%3A%2F%2Fjjal.today%2Fbbs%2Fboard.php%3Fbo_table%3Dgallery%26wr_id%3D865%26sfl%3Dwr_subject%257C%257Cwr_content%257C%257Cwr_4%26stx%3D%25EB%2593%259C%25EB%25A6%25BD%26sop%3Dand%26page%3D3&tbnid=k46bux6PMOQnXM&vet=1&docid=8Lij4Y9CBDzZJM&w=643&h=477&hl=ko-KR&source=sh%2Fx%2Fim

    인스턴스의 멤버변수는 인스턴스마다 다른 값을 가져야 하니 인스턴스 생성 시 마다 스택에 영역이 할당된다.
    그리고 변수들을 후입선출인 스택에 쌓는 이유는 가장 나중에 메모리에 올라간 가장 안쪽 블럭의 지역 변수가 가장 먼저 메모리에서 해방되어야 하기 때문이다.

    그리고 객체의 인스턴스는 힙에 올려두고 주소 값만 담고 있는 변수가 스택에 쌓인다.
    그 이유는 변수가 불릴 때마다 몸집이 큰 객체를 계속 들고다니기 보다는 그 데이터가 어디있는지 가리키는 값만 가볍게 불리는 게 효율적이기 때문이다.

    그리고 메소드는 인스턴스마다 다른 값을 갖는 멤버 변수와 달리 같은 종류의 클래스의 인스턴스들에 대해 같은 일을 수행한다.
    따라서 힙에 있는 인스턴스마다 메소드가 들어있을 필요가 없다.
    따라서 메소드도 메소드 영역에 넣어두고 몸집이 큰 메소드를 직접 부르지 않고 주소값을 이용해 가볍게 가볍게 메소드를 사용할 수 있게 해준다.

    그 원리를 알게 되니 억지로 외우려하지 않아도 자연스럽게 구조를 그릴 수 있게 되었다.
    뭔가 외워지지 않고 복잡하다면 각각이 왜 존재할 수 밖에 없는 지를 중심으로 원리를 알아보자.

    댓글

Designed by Tistory.