티스토리 뷰
자바는 참 편하다 개발자가 신경 쓰지 않아도 메모리 관리를 척척 해주고
write once, run anywhere 정신으로 각각의 운영체제 별로 코드를 따로 작성하지 않아도 된다
JVM 덕분에 편한 인생을 살고 있지만 그럼에도 메모리 관리를 직접 해줘야 하는 경우도 있다
1. 책의 예시에서 나오는 자기 메모리를 직접 관리하는 Stack과 같은 클래스 작성 시
2. 애플리케이션 내의 캐시 이용 시
3. 리스너 / 콜백을 이용하는 이벤트 기반으로 작성 시
대부분의 상황에서는 JVM이 우리의 할 일을 대신하여 메모리라는 방을 청소해준다
JVM이 해주지 못하는 예외의 경우가 위 세가지 상황 같은 것이고 제대로 처리하지 않으면 메모리 누수로 연결된다
다 쓴 참조를 가지고 있는 경우 더 이상 사용할 일이 없어도 참조를 가지고 있는 이유로 GC 수거 대상이 되지 못한다
GC는 GC Root 부터 연결된 놈들을 하나씩 찾아가서 mark-sweep 방식으로 동작하기 때문이다
쓰지도 않을걸 가지고 있으니 이 것들이 차곡차곡 모여 OutOfMemoryError를 시원하게 터트려준다
아하 제일 중요한 것부터 연결된 놈들을 찾아가는구나 하고 이해가 되는데
그렇다면 GC Root는 무엇인가? 일단 검색하자 여지 없이 등장하는 밸덩 글을 읽어보자
글을 참고해 짧게 정리하자면 GC 동작 방식을 이해하기에 앞서 JVM의 메모리 구조를 이해해야 한다
JVM은 공유 영역인 Method Area, Heap과
스레드 별 개별 영역인 Stack, Native Method Stack(JNI), Program Counter(PC) 영역으로 나눠진다
요놈들이 전부 GC Root가 될 수 있는 녀석들이다
GC가 돌면 얘네부터 시작해서 얘네가 참조하는 모든 녀석들을 마크하고 마크된 놈들을 제외하고 쓸어버린다
그렇기 때문에 우리가 실행 중인 프로그램에서 GC가 돌더라도 수행 중인 정보가 날아가지 않는 것이다
지금 당장 사용하지 않는 객체라도 무작정 죽여버리는게 아니라 GC Root가 참조하고 있는지 아닌지가 기준이다
아나.. 자바 스프링으로 웹개발 하는데 이런 것까지 알아야 돼?! 싶겠지만 알면 좋다
초보에게는 공부 방향 잡는 것도 쉽지 않다, 개발의 분야가 너무나 방대한 탓이다
개발 세계를 공부하다 보면 과연 어디까지 알아야 하는 것인가 하는 의문이 드는데 이에 대해 참고해볼 좋은 글이 있다
https://okky.kr/article/559243
위 글에서는 웹개발자에게 웹 개발은 전공이자 무기고 로우 레벨은 교양을 학습하는 것과 같다고 한다
따라서 웹개발자가 할 일은 로우 레벨 처리는 JVM에게 어느 정도 맡기고 전공을 특화해야 한다 말한다
이전까지는 뇌를 잠깐 빼놓고 우당탕탕 개발해왔지만 한 땀 한 땀 이유를 가지고 코드를 작성하는 많은 분들께 자극받고
바로 클린 코드, 리팩터링 조지러 간다 더 높은 추상화로 쭉쭉 올라가야지
올라가는 와중에도 로우 레벨이란 교양까지 챙겨가면 더 좋고
'Java > Effective Java' 카테고리의 다른 글
[Item09] 뭐든 수준 높게 사용하자 (0) | 2022.02.15 |
---|---|
[Item08] finalizer, cleaner를 알아보지 말자 (0) | 2022.02.14 |
[Item06] 재사용으로 성능 향상 시켜보자 (0) | 2022.02.10 |
[Item05] 때려박는 코딩은 그만, 확장성을 고려하자 (0) | 2022.02.08 |
[Item04] 인스턴스화 방지, setter 막아두기 과연 옳은가 (0) | 2022.02.05 |