2012-02-10 3 views
1

저는 트리 생성과 관련된 시뮬레이션을 실행 중입니다. 내 트리의 분기 계수는 2/3에서 7/8까지입니다.가비지 컬렉터 대 풀

내가 그것을 확장해야 할 때마다 나는 자식 배열을 할당합니다. 종종 하나의 브랜치를 새로운 트리로 만듭니다 (루트의 루트 노드를 루트로 설정 함). 그래서 나머지 트리는 쓰레기가됩니다.

가비지 컬렉터가 자신의 작업을 수행하도록하는 것이 더 나은지 궁금합니다. 트리 루트를 변경할 때 System.gc()를 사용하여 수집을 시작하거나 TreeNodes에 대한 자체 풀을 구현하는 것이 좋습니다. 그리고 내가 루트를 바꿀 때, 지금 쓸데없는 모든 노드를 재활용하십시오.

대답은 다음과 같이 읽을 수 있습니다. : 안드로이드 가비지 컬렉터가 매우 최적화 되었습니까? 아니면 상당히 많은데도 객체 생성/제거를 제한하는 것이 더 낫지는 않습니까? (모든 트리를 탐색해야합니다. 각각의 쓸데없는 노드가 내 수영장의 스택에)

나는 그 안드로이드 GC는 "진화"(기본적으로 당신이 메모리가 부족할 때 실행되지 않습니다) 읽었습니다. 또한 그냥 모든 참조를 삭제하는지 모르겠다. 트리의 루트는 gc 가비지가 단일 패스에서 모든 트리를 수집하도록하거나, 노드 만 gc하고, ​​그 노드의 하위 노드는 다음 패스 등을 지정합니다.

답변

1

GC가 ev인지 이해할 필요가있다. 너를위한 걱정. 그래서 -verbosegc로 앱을 실행하십시오. GC가 성능 문제 또는 메모리 쌓기를보고하면 걱정할 수 있습니다. 그렇지 않으면 할 일의 등식에서 그것을 제거하십시오.

GC는 여러 세대에 걸쳐 작동합니다. 기본적으로 할당은 세대로 구분됩니다. 앱이로드 될 때 모든 할당은 0 세대에 속합니다. 앱이 진행되면 할당은 1 세대와 2 세대에 배치됩니다. 실행되는 GC는 1 세대와 마찬가지로 0 세대에서도 자주 작동하지 않습니다. 마찬가지로 실행되지 않습니다. 더 자주 2 세대 에서처럼 1 세대에서 발생합니다. 이것은로드 타임에 할당 한 객체가 나중에 생성되는 객체만큼 자주 해제 될 필요가 없다는 가정하에 수행됩니다. 모든 응용 프로그램에서 http://chaoticjava.com/posts/how-does-garbage-collection-work/

  • 에서

    재미있는 따옴표는, 객체는 자신의 생명 라인에 따라 분류 할 수있다.

  • 일부 개체는 대부분 로컬 등의 수명이 짧으며 일부는 응용 프로그램의 백본과 같이 수명이 오래입니다. 세대 가비지 컬렉션에 대한
  • 생각은 는 애플리케이션 A에 € ™ s의 수명이 대부분의 인스턴스 객체가 수명이 짧은 것을, 그리고 는 단명에 수명이 긴 개체 사이의 몇 가지 연결이 있다는 이해를 가능하게했다 개체.
+0

나는 이미이 기사를 읽었지만, 정말 흥미 롭습니다. 그러나 저는 특히 안드로이드 gc에 대해 이야기하고 있습니다. 내 응용 프로그램에서는 seams가 자주 실행됩니다 (logcat은 GC_Concurrent를 인쇄하고 x % y/z는 5ms + 6ms 사용). 내 응용 프로그램에 성능 문제가 (그것은 여전히 ​​60fps 실행), 난 안드로이드 (너무 모바일) ** 플랫폼에 대한 모범 사례 **에 대해 궁금하네요 (기사는 2008 년부터, 그래서 그것을 적용 할 수 있다고 생각하지 않습니다 안드로이드 gc, 또한 안드로이드 gc 나중에 버전에서 많이 바꾼 생각) –

+0

자신의 treenodes 구현 실제로 그것을 해결하는 흥미로운 방법입니다. 질문은 당신이 여기서 무엇을 측정하고 있는지입니다. 성능을 측정하지 않으면 메모리 사용률은 어떻습니까? 여기서 무엇을 측정하는지 알지 못하면 어떤 이점이 주어질 지 모릅니다.GC가 너무 많은 시간을 소비하고 있습니다. 앱에서 기대하는 반응을 얻지 못했습니까? 너무 많은 기억을 차지하고 있습니까? 당신 자신의 수영장을 작성함으로써, 당신은 GC를 향상시킬 것이라고 생각합니까? gc가 문제라면, gc가 얼마나 많은 시간을 사용하고 있는지 측정 한 다음 풀을 작성하고 다시 측정하십시오. 측정 중이십니까? – Siddharth

+0

이미 제네릭 풀이 있으므로 TreeNode에 대한 풀을 작성하는 것은 TreeNode를 요청할 때 값을 수정하고 TreeNode를 재사용 할 때 모든 자식을 재활용하도록 트리를 탐색하여 업데이트하는 문제입니다. 메모리가 지금은 문제가되지 않습니다 (아직까지 코드를 풀기위한 버그가 있기 때문에 아직 오랜 시간 동안의 시뮬레이션을 시도하지 않았습니다). 그리고 CPU도 아닙니다.하지만 저는 모바일에서 실행되고 있습니다. 더 효율적인 코드는 사용자 낭비를 줄이는 배터리가 적고 안드로이드는이 주제에 대해 잔인합니다 (앱이 얼마나 많은 배터리를 소비하는지 명확하게 보여줍니다). 아니, 나는 측정하지 않고있다. (좋은 지적) –

관련 문제