2017-12-10 3 views
1

"The Garbage Collection HandBook"이라는 책을 읽을 때 9 장 은 "객체 수명은 출생과 출생 사이에 할당 된 힙 공간의 바이트 수로 측정하는 것이 더 낫습니다. 죽음.". 나는이 문장을 이해하지 못한다. 왜 일생은 할당 된 바이트로 측정 할 수 있습니까? 나는 그것에 대해 구글을 시도한다. 그러나 나는 어떤 대답도 얻지 않는다. 누가 나에게 설명 할 수 있습니까? 감사!힙을 측정하는 시간에 객체를 할당하는 방법

답변

1

인스턴스화와 죽음 사이에 할당 된 바이트로 개체 수명을 측정하면 GC 알고리즘이 프로그램 동작에 적응하기가 더 쉽습니다.

개체 할당 속도가 매우 느리면 간단한 시간 측정으로 인해 모음간에 긴 일시 중지가 발생하여 양호한 것으로 보입니다. 그러나 개체 수명의 바이트 할당 측정 값이 높으면 개체가 생존자 공간 또는 구 세대에 너무 빨리 승격 될 수 있습니다. 바이트 할당을 측정함으로써 콜렉터는 마이너 콜렉션이 발생하기 전에 새 세대를 확장하여 가비지가되는 오브젝트 수를 늘려 힙 크기를보다 효율적으로 최적화 할 수 있습니다. 이 측정 값으로 시간 만 사용하면 힙의 크기가 분명해질 필요가 없습니다.

멀티 스레드 응용 프로그램에서 개별 스레드에 대한 바이트 할당을 측정하기가 어렵 기 때문에 수집기는 개체가 남아있는 컬렉션 수에 대한 수명을 측정하는 경향이 있습니다. 이것은 모니터하는 데 더 간단한 번호이며 기록 할 공간이 적습니다.

1

"시간"은 이벤트를 주문할 수있는 척도입니다. 현실 세계에서도 가능한 많은 유닛이 있습니다. 컴퓨터 내부에서 쓰레기 수거를 위해 실세계의 시간 단위는 필요하지 않으며 모든 가비지 수집기가 일반적으로 알고 싶어하는 것은 어떤 개체가 다른 개체보다 오래되었는지입니다.

이 목적을 위해서 할당 된 각 객체에 오름차순 번호를 할당하는 것만으로 충분할 수 있지만 이는 추가 카운터를 유지하는 것을 의미합니다. 반대로 할당 된 바이트 수는 무료입니다. 할당 된 바이트 만 누적하고 할당 해제 된 바이트는 절대로 빼는 것이 중요하므로 항상 숫자가 늘어납니다.

개체가 전용 ​​공간에서 연속적으로 할당되므로 세대 별 메모리 관리에서이 번호는 모든 할당시 업데이트 될 필요가 없으므로 해당 주소는이 메모리 영역 내에서 상대적인 보존 기간을 나타내지 만 영역의 시작 부분 마지막 가비지 수집과 관련되어 있습니다. 가비지 컬렉터가 살아남은 객체를 실행하고 이동할 때만 필요한 경우이 정보를 절대적인 시대로 병합해야합니다.

HotSpot JVM과 같은 구현을 통해이 점을 더욱 단순화 할 수 있습니다. 살아남은 객체의 경우, 살아남은 가비지 수집주기의 수를 유지하는 작은 카운터를 유지합니다. 설정 가능한 수의 수집주기에서 살아남은 후에는 구세대로 승격되고 그 시점을 지나면 객체의 나이가 부적절 해집니다.

+0

당신은 "대조적으로 할당 된 바이트 수는 무료입니다."라고 말합니다. 그런 다음, 출생과 사망 사이의 모든 객체에 할당 된 바이트 수를 계산하는 방법은 무엇입니까? 모든 물체에 추가 카운터 또는 다른 방법이 필요합니까? 나는 작은 퍼즐이다. – Huzhenyu

+0

막내 개체가 같은 공간에있는 한 마지막 개체의 끝은 할당 된 바이트 수와 같습니다. 즉, 서로 다른 메모리 공간을 통해 절대 수명을 추적하려는 경우 다음 가비지 수집주기 *에서 해당 메모리 공간의 기본 기간 (마지막 gc 시간)과 병합해야합니다. 이것은 정보를 보유 할 스토리지를 필요로 함을 암시 할 수 있습니다. 그러나 일반적으로 JVM은 객체의 사망까지의 나이를 추적하지 않습니다. JVM은 객체의 죽음을 전혀 감지하지 못합니다. 그들은 생존자들에 대해서만 관심이 있습니다. – Holger

관련 문제