본문 바로가기
개발공부 개발새발/JAVA

JAVA) 클래스는 대체 어디에 생성되는 것일까? (feat.자바 메모리 종류)

by 휴일이 2022. 10. 8.

**이 게시글에 써있는 내용은 틀릴 수도 있습니다**

**틀렸다고 생각하면 댓글 달아주세요 ㅠㅠ궁금해죽겠음**

 

 

자바에서 메모리 영역은

메소드영역(스태틱 영역)

스택 영역

힙 영역이 있다고 배웠다

(거의 스택이랑 힙만 배움) 제일 중요하니까 그렇겠지?

 

 

스택에는 메소드를 호출할때마다 그 메소드를 불러오는 역할~

힙은 객체가 생성되면 힙에 생성~

메소드영역(스태틱영역)에는 상수, 스태틱멤버 들이 불러와짐~

ㄴ그럼 스태틱 영역에는 내 자바에 있는 모든 스태틱이 한꺼번에 불러와질까?

ㄴ쌤한테 물어보니까 그렇다고 한다..클래스파일이 많으면 컴퓨터가 개힘들겟군ㄷㄷ

 

 

근데 대체....클래스는....어디서오는 걸까?????ㅡㅡ

쌤이 쓸데없는 거 생각하지 말구 코드연습 같은거 하라구했는데

궁금해서 참을 수 없었다 ㅠㅠ

 

 

구글링을 정말 열심히 했다....

내가 정리한 결론부터 말하면

 

 

1.JVM에서 클래스 로더가 해당 클래스를 찾아서 로딩함
(이 때, 자바에 저장된 모든 스태틱 멤버는 스태틱 메모리에 자동 저장됨, 기본제공 스태틱뿐만 아니라 내가 만든 스태틱도)
2.클래스는 스태틱 영역에 생성됨
3.클래스의 인스턴스 생성->힙 메모리에 생성됨->생성될 때 생성자도 자동호출(초기화 위해) //클래스가 가지고 있는 거 자체가 다 넘어감
4.만들어진 인스턴스에 있는 메소드가 호출되면 그게 스택에 쌓여서동작하고 다 재생하면 다시 사라짐
(스태틱변수,스태틱메소드,스태틱초기화블럭은 스태틱에서 동작)
(지역변수,매개변수는 메소드에만 존재하기 때문에 메소드가 스택으로 옮겨갈때 같이 옮겨가서 스택메모리에서 동작한다고 보는 거인듯)
(힙메모리에 생성된 클래스의 인스턴스는, 가리키는 참조 변수가 사라지면(주소가 사라지면) GC로 청소함)
->그리고, 만약 내가 쓴 코드에 있는 클래스가 스태틱 영역에 없다? 시스템클래스 로더에 클래스 로드 요청함
ㄴ 시스템이 확장->확장이 부트스트랩에 요청하는데
ㄴ부트스트랩은 부트스트랩 클래스패스에 클래스가 있는지 확인하고 없으면 확장한테 요청 넘김
ㄴ확장은 확장 클래스패스에 클래스가 있는지 확인하고 없으면 시스템한테 넘김
ㄴ시스템 클래스로더는 시스템 클래스패스에 클래스가 있는지 확인
ㄴ시스템한테까지 없으면  ClassNotFoundException !!!

 

 

 

이런 과정으로 저장되는 거 같다....

틀리면 누가 댓글달아주세요 제발 ㅠㅠ....너무 궁금해서 미치겠어요

 

 

 

 

찾아보는 김에

메모리 영역에 대한 정리도 해보았다!!!

 

 

 

스택/힙/스태틱 메모리로 나뉨

static(or method) 메모리 / 정적메모리
- JVM이 동작해서 클래스가 로딩되면 생성됨
- 런타임상수풀(모름) 멤버 변수(전역변수,필드) static변수, (final)상수(근데 필드에 있는 건 X), 생성자, 메소드 저장
- 클래스의 인스턴스를 만든다 / JVM에서 클래스 정보를 넘겨서
->힙 영역에 생성
힙 영역에 생긴 메소드를 실행한다면?
그게 Stack으로 넘어가서 실행


스택 메모리
- 지역변수 데이터 값 들어감
- 메소드가 호출될때 스택 영역에 스택 프레임이 생기고 그안에 메소드를 호출 (공간에 메소드를 호출)
- primitive 타입의 데이터(int, double, byte, long, boolean 등) 에 해당되는 지역변수, 매개 변수 데이터 값이 저장 
- 메소드가 호출 될 때 메모리에 할당되고 종료되면 메모리에서 사라짐


힙 메모리 /동적 메모리
- 참조형 타입 저장 (객체-인스턴스, 배열)
- 단, Heap 영역에 있는 오브젝트들을 가리키는 레퍼런스 변수는 stack에 적재
- 스택에는 실행하고 사라지지만, 호출이 끝나더라도 유지함(객체가 유지되는 거)
- 근데 아무도 그 인스턴스를 참조하지 않으면 GC(가비지 컬렉터)에 의해 삭제됨
- stack은 스레드(실행되는 갯수)마다 각각 생성되지만 heap은 단 하나의 영역만 존재(거기다가 다 집어넣음)

 

 

 

여러가지 글을 보면서

내가 가진 지식들을 이용해 제일 쉽게 풀어 쓰려고 노력했다..ㅠㅠ

언젠가 기억이 안 나면 다시 볼 수 있게!!

 

 

근데 아마 내가 자바에 대해서 더 공부하고 알게 됐을 때

정리한 내용을 보면 느낌이 또 다르지 않을까?

(엥??ㅡㅡ이렇게 이해했었네ㅋ 더 들어가면 이게 아닌데ㅋ)

하는 느낌으로다가...

 

 

 

---------------------여기서부터는 사담

 

지금 학원에서는 타입변환, instanceof 등등...까지 배웠고

나는 인터페이스까지 예습했는데

 

아직까지는 자바가 재밌다!!

 

그 전까지는 예체능만 해와서

정답이 없고 사람마다 해석이 다 다른 결과물을 내는 게

재미도 있지만 깊이 파다보니 힘들었는데

 

얘는 과정에 정답은 없지만

결국 결과는 똑같기 때문에

그게 좋당....ㅎ

 

뭐 만들고 싶은데 내가 도저히 방법을 모르겠을 때

다른 사람의 코드를 가져와서 분석하는데

이것도 되게 힘들긴 한데(스트레스 개받음)

그걸 이해했을 때 내 꺼로 만들어서 내 방식대로 사용하면

그건 그거대로 재미있고..

 

쌤은 자바는 그럭저럭 하는 사람도

웹 들어가면 힘들어하는 사람 많다고 하던데 ㅠㅠ

걱정된다...

 

자바 다음에 오라클 배운대서

자바 예습 끝내놓고 오라클 예습해야겠다...;;ㅠㅠ

웹 들어가는 거 넘 무섭당...

728x90