틈틈히 작성하는 WIL은 한 주 동안 공부했던 내용 중에 재밌는 부분만 다시 발췌하여 포스팅하는 글입니다.
피드는 언제나 감사드립니다 ~_~, 글 내용 중 참조된 부분의 본문은 footer 부분에 레퍼런스를 참고 부탁드립니다. 


① 가비지 컬렉터
가비지 컬렉터에 대해 공부하기 전에 String 타입을 생각해 보자. String 타입은 불변 객체라서 += 연산시 메모리에 새롭게 잡히게 된다.

Reachable 한 변수
- 이 처럼 변수와 메모리 사이에 잡히는 것은 Reachable 하다 고 표현한다. 그럼 String 객체를 여러 개 생성하게 되면 어떻게 될까?
자연스럽게도 Unreachable 객체가 여러개 생기게 되는것이다. (메모리와 객체 사이에 연결이 안됨)

Mark and Sweep
- GC Root에서 시작해 이 Root가 참조하는 모든 오브젝트, 또 그 오브젝트들이 참조하는 다른 오브젝트들을 탐색해 내려가며 마크(Mark)한다. 그래서 Mark 작업을 수행할 때는 Stop the World 로 스레드를 중단하게 된다. 이때는 System.gc()로 Mark 작업의 모든 스레드를 중단 시킨다. 
- Mark가 끝나면 가비지 컬렉터는 힙 내부를 전체를 돌면서 Mark되지 않은 메모리들을 해제(Reclaim)한다. 이 과정을 Sweep이라고 부른다.

https://imasoftwareengineer.tistory.com/103

 

https://imasoftwareengineer.tistory.com/103

JVM Heap 구조
- JVM Memory에서 Heap 구조를 보여준다. Heap 에서 객체의 라이프사이클을 다뤄보며, 가비지 컬렉션이 어떻게 동작하는지 살펴보자

https://mirinae312.github.io/develop/2018/06/04/jvm_gc.html


- 처음 생성된 객체는 Young Generation 영역의 일부인 Eden 영역에 위치하게된다. 그리고 Minor GC가 발생하게 되면, 사용하지 않는 다시말하면 Unreachable 다른 곳에서 참조되지 않는 객체는 메모리에서 제거된다.

Eden 영역에서 살아남은 객체는 Young Generation 영역의 또다른 일부인 Survivor 영역으로 이동하게된다. Survivor 영역은 Survivor1 영역과 Survivor2 영역으로 구성되어 있는데, Minor GC가 발생할 때마다 Survivor1 영역에서 Survivor2 영역으로 또는 Survivor2 영역에서 Survivor1 영역으로 객체가 이동하게되며, 이 과정에서 더이상 참조되지 않는 객체는 메모리에서 제거된다.

특히 이때는, Suvivor1 에서 2로 옮겨 갈때는 age 값이 하나씩 증가하는데 특정 age 값에 따라서 Old Generation 이 발생한다. Old Generation이 발생하는것을 Promotion 이라고 한다. 


Old Generation 영역에 있다가 미사용된다고 식별되는 객체들은 Full GC를 통해 메모리에서 제거된다.

https://mirinae312.github.io/develop/2018/06/04/jvm_gc.html

② upper bound 와 lower bound

사실 이 부분은 백준에서 10816번 숫자 카드2 문제를 풀어보며 이론을 익혔다. 내용은 즉슨 간단하다. 문제 중 일부의 내용을 발췌했다.

<< 문제 내용
숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 N개를 가지고 있다. 정수 M개가 주어졌을 때, 이 수가 적혀있는 숫자 카드를 상근이가 몇 개 가지고 있는지 구하는 프로그램을 작성하시오.

>>

결론적으로 말하면 하한 개수에서 상한 개수를 빼주면 그 해당 숫자의 개수가 나오게 된다. 즉 상한과 하한의 코드만 구현해주면 된다. (단, 원본 Array에서는 이미 오름 차순 정렬이 되어 있어야 한다.)
이분 탐색을 조금만 응용하면 문제를 해결할 수 있다. 소스 코드 첨부해서 자세히 살펴보자. 

아래 그림을 보면 lower case 는 index 의 위치 3이다. 반대로 upper case는 5이다. 
아래의 키 값을 보면 4 가 있는것을 확인할 수 있는데 최초로 나오는 lower case (인덱스 : 3) 그리고 나중에 나오는 upper case (인덱스 : 5) 서로 빼주고 + 1 해주면 key 의 개수를 count 할 수 있다. 

https://st-lab.tistory.com/267

 



참고
① :
- https://imasoftwareengineer.tistory.com/103

 

가비지 컬렉터(Garbage Collector)와 Mark & Sweep

이번 포스트에서는 JVM(Java Virtual Machine)의 메모리 관리방법에 대해서 약간 설명하도록 한다. JVM의 메모리 관리방법을 알기 위해서는 JVM이 무엇인지에 대해 먼저 알아야한다. 따라서 JVM에 대해 간

imasoftwareengineer.tistory.com

https://mirinae312.github.io/develop/2018/06/04/jvm_gc.html

 

Java 의 GC는 어떻게 동작하나? - J's log

Java 프로세스가 동작하는 과정에서 GC는 불필요한 또는 더이상은 사용하지 않는 객체들을 메모리에서 제거함으로써, Java 프로세스가 한정된 메모리를 효율적으로 사용할 수 있게 해준다. 또한 JV

mirinae312.github.io