2014-01-30 1 views
2

Android 앱의 성능을 향상 시키려하고 있으며 과도한 가비지 수집으로 인한 문제가 있다고 결론을 내 렸습니다. 힙 도구를 사용하여 할당 된 내용을 확인할 수 있지만 가비지 수집 대상을 확인하는 것이 좋습니다.GC 동안 무엇이 해제 되었습니까?

Java GC에서 어떤 객체가 해제되었는지 알 수있는 방법이 있습니까? 스톡 도구로 가능합니까? 이것에 대한 타사 도구가 있습니까?

+0

[PhantomReferences] (http://docs.oracle.com/javase/7/docs/api/java/lang/ref/PhantomReference.html)는 객체가 GC가 될지 여부를 추적하는 데 사용됩니다. PhantomReferences로 수집 할 실제 개체를 검색 할 수 없으므로 개체를 직접 추적해야합니다. 또한 PhantomReference가 null로 설정되거나 자연스럽게 참조를 잃는 경우 객체는 GC입니다. 어쩌면 [이 예제] (https://github.com/RovoMe/PluginApplication/blob/unstable/PluginFramework/PluginCore/src/my/java/at/rovo/core/injection/InjectionControllerImpl.java)가 –

+1

내 머리에서 빠져 나옵니다. : 관심있는 클래스에 대해'finalize()'메소드를 오버라이드 할 수 있습니다. 오브젝트가 gc 된 사실을 기록하는 기능을 추가하십시오. (적절한 프로파일 링 도구를 사용하여이를 수행하는 더 좋은 방법이있을 수 있습니다.) –

+1

@MartijnCourteaux'finalize()'는 GCed 될 객체를 되찾아서 객체의 실제 GC를 막을 위험이 있습니다. PhantomReferences는 이것을 허용하지 않지만 누군가가 PR에 대한 참조를 계속 유지한다면 이는 GC를 방지합니다. –

답변

2

"이전"및 "이후"힙 덤프를 캡처하고 차이를 계산하여이 작업을 수행 할 수 있습니다.

이 하드하게 기본적인 문제

는 GC가 폐기에, 그것은 정말 해방 된 개체를 수집 목록을 위해 개발하지 그래서 에,을 유지 무엇을 결정할지 결정하지 않는다는 것입니다. 일부 구현에서는 객체 별 폐기 작업이 없을 수 있습니다. (저장소의 모든 페이지에 대해 약간의 테이블이 있다고 가정하면 GC의 시작 부분에서 모든 비트를 0으로 설정하고 보관하는 모든 객체에 대해 페이지가 접촉하는 비트를 1로 설정합니다 끝나면 0 비트가있는 페이지는 무료이며 새로운 할당에 사용할 수 있습니다.

작성한 개체에 대한 finalizer 및 팬텀 참조로 일부 게임을 할 수 있지만 모든 게임에는 동일한 기능이 없습니다. 힙 개체.

관련 문제