안드로이드 API21부터 shadow$monitor(이하, monitor)와 shadow$klass(이하, klass) 변수가 추가되었다. 먼저, monitor 변수는 hashcode() 메소드에서 사용하기 위해 추가되었다.
klass 변수는 Brooks pointer라는 이름의 컨셉을 구현하기 위한 것으로 보인다. 이 컨셉에서 힙 메모리에 있는 모든 객체(object) 속의 klass 변수는 자기 자신 객체를 가리키는 역할을 한다. 그리고, GC를 위해 객체가 다른 장소로 이동(정확히는 복사 후 삭제)될 때 새로운 객체를 즉시 가리킨다. 이런 방법을 통해 “stop-the-world”를 피하는 동시에 어떤 스레드는 이전 객체(one in from-space)를 또 다른 스레드는 이후 객체(one in to-space)를 참조하는 불일치를 해결할 수 있다.
대신 두가지 단점이 있는데, 하나는 최소 하나의 객체 당 1워드의 힙메모리를 더 사용한다는 것과 객체를 읽고 쓰는데 추가적인 작업이 발생한다.
이에 대한 원문과 더 자세한 내용은 아래 참고를 참조하자. 참고로, Roman Kennke의 블로그에서는 이런 방법을 Shenandoah GC라고 부르고 이 GC의 일부로 Brooks pointer 컨셉이 사용된 것으로 보이나, 안드로이드 사이트에 이에 대한 언급은 따로 없다.
참고