Java Virtual Machine-가비지 수집
Java 개체의 수명주기는 JVM에서 관리합니다. 프로그래머가 객체를 생성하면 나머지 수명주기에 대해 걱정할 필요가 없습니다. JVM은 더 이상 사용되지 않는 객체를 자동으로 찾고 힙에서 메모리를 회수합니다.
가비지 수집은 JVM이 수행하는 주요 작업이며 필요에 맞게 조정하면 애플리케이션의 성능을 크게 향상시킬 수 있습니다. 최신 JVM에서 제공하는 다양한 가비지 수집 알고리즘이 있습니다. 우리는 어떤 알고리즘을 사용할지 결정하기 위해 우리 애플리케이션의 필요성을 인식해야합니다.
C 및 C ++와 같은 비 GC 언어에서 할 수있는 것처럼 Java에서 프로그래밍 방식으로 객체를 할당 해제 할 수 없습니다. 따라서 Java에서 매달린 참조를 가질 수 없습니다. 그러나 널 참조 (JVM이 객체를 저장하지 않는 메모리 영역을 참조하는 참조)가있을 수 있습니다. 널 참조가 사용될 때마다 JVM은 NullPointerException을 발생시킵니다.
GC 덕분에 Java 프로그램에서 메모리 누수를 발견하는 경우는 드물지만 발생합니다. 이 장의 끝에서 메모리 누수를 만들 것입니다.
다음 GC는 최신 JVM에서 사용됩니다.
- 직렬 수집기
- 처리량 수집기
- CMS 수집기
- G1 수집가
위의 각 알고리즘은 더 이상 사용되지 않는 객체를 찾고 힙에서 차지하는 메모리를 회수하는 동일한 작업을 수행합니다. 이에 대한 순진한 접근 방식 중 하나는 각 객체가 가지고있는 참조 수를 계산하고 참조 수가 0이되는 즉시 해제하는 것입니다 (참조 계수라고도 함). 순진한 이유는 무엇입니까? 순환 연결 목록을 고려하십시오. 각 노드는 이에 대한 참조를 가지지 만 전체 객체는 어디에서나 참조되지 않으며 이상적으로는 해제되어야합니다.
JVM은 메모리를 해제 할뿐만 아니라 작은 메모리 척을 더 큰 척으로 통합합니다. 이것은 메모리 조각화를 방지하기 위해 수행됩니다.
간단히 말해서 일반적인 GC 알고리즘은 다음과 같은 활동을 수행합니다.
- 사용하지 않는 개체 찾기
- 힙에서 차지하는 메모리 해제
- 조각 합치기
GC는 실행되는 동안 애플리케이션 스레드를 중지해야합니다. 이는 실행될 때 개체를 이동하므로 해당 개체를 사용할 수 없기 때문입니다. 이러한 중지를 '세계 중지 중지'라고하며 이러한 중지의 빈도와 지속 시간을 최소화하는 것이 GC를 조정하는 동안 우리가 목표로하는 것입니다.
메모리 통합
메모리 통합의 간단한 데모는 다음과 같습니다.
음영 처리 된 부분은 해제해야하는 개체입니다. 모든 공간이 회수 된 후에도 최대 크기 = 75Kb의 객체 만 할당 할 수 있습니다. 이것은 아래와 같이 200Kb의 여유 공간이있는 경우에도 마찬가지입니다.