모바일 플랫폼이 세대 별 가비지 콜렉션을 지원하지 않는 이유는 무엇입니까?


11

Windows Phone / Xbox 및 Android는 모두 세대 가비지 콜렉션을 지원하지 않습니다. 이것은 많은 프로그래머에게 실망입니다. 이에 대한 합법적 인 엔지니어링 이유가있는 것 같지만 이해할 수 없습니다.

현재 전화는 2001 년 세대 GC로 .NET 1.1을 실행하는 데스크톱 / 노트북보다 더 많은 메모리와 CPU를 가지고 있으며, ARM 프로세서가 x86보다 GC에서 나빠질 이유를 생각할 수 없습니다. 전화 및 콘솔에서 멀티 태스킹이 덜 필요하므로 사용 가능한 힙 공간이 더 많습니다.

무엇을 제공합니까?

편집 : 명확히해야 할 몇 가지 사항 :

  • 이 플랫폼은 앱에 가비지 수집을 독점적으로 사용하므로 GC가 지원되지 않는 이유에 대한 질문은 없습니다. 내 질문은 왜 세대 가비지 콜렉션이 아닌지에 관한 것입니다.
  • 세대 별 GC 부족에 대해 사람들이 불만을 갖는 이유는 비 생성 GC가 매우 비효율적이기 때문입니다. 이는 배터리 수명이 그 이유가 아님을 의미합니다.
  • 세대 별 GC 지원이 부족한 정직한 기술적 이유가 있다고 생각합니다. 이것은 수사적인 질문이 아닙니다.

Windows Phone (현재 세대)에는 가비지 콜렉션이 있습니다. 장치가 메모리가 부족한 경우에만 실행 msdn.microsoft.com/en-us/library/gg490770.aspx
톰 종복

@TomSquires WP7의 GC는 실제로 1MB 할당마다 한 번씩 실행됩니다. 오래된 프로세스를 커닝하는 작업 관리자에 대해 생각하고 있다고 생각합니다.
Rei Miyasaka

답변:


5

가장 큰 문제는 배터리 수명이라고 생각합니다. 가비지 콜렉션은 사용자 컴퓨터 의 추가 CPU주기 가격으로 구입 한 개발자 편의 입니다. CPU가 연결되어 있거나 (데스크톱) 배터리 용량이 비교적 큰 경우 (랩탑) 가비지 수집을 수행하는 동안 CPU가 소비하는 추가 에너지로 개발자의 편의에 더 많은 비용을 지불 할 의사가 있습니다. 배터리가 상대적으로 작 으면 사용자가 관대하지 않을 수 있습니다. 그들은 자신의 추가 막대를 원할 수도 있습니다. 아마 친구들과 대화하거나 화난 새들과 치명적인 만남으로 몇 마리의 여분의 돼지를 죽일 수도 있습니다.

사용자의 이유가 무엇이든 OS 개발자는 OS를 실행하는 장치가 경쟁사의 OS를 실행하는 장치보다 배터리를 빨리 소모한다는 인식 을 원하지 않습니다 . 따라서 개발자의 편의를 위해 장치의 예상 배터리 수명 시간을 더 잘 인식합니다. 사용자가 장치에 만족하는 한 고통은 크지 않습니다.


3
세대 별 GC는 실제로 대부분의 경우 훨씬 더 효율적이므로 클록 사이클 수를 줄이겠다 고 생각할 것입니다. X 박스 같은 것이 세대 GC를하지 않는 이유 X 박스가 연결되어 있기 때문에 그것은 또한, 설명하지 않습니다.
레이 Miyasaka

글쎄, 그것이 Stack Overflow에서 들었던 것 입니다. 그래도 XBox-es에 대해 많이 알지 못합니다.
dasblinkenlight

3
그래도 질문에 대답하지 않습니다. 가비지 수집이 명시 적 할당보다 더 많은 전력을 사용하더라도 (높은 논쟁의 여지가 있지만 그것에 들어 가지 않을 것입니다.) 세대 GC는 모바일 세대 GC보다 낫습니다.
Rei Miyasaka

1
@Rei : 게임은 일반적으로 모든 것이 결정 론적이어야합니다. 최소한 예측 가능한 성능이 필요합니다. 여기에서 몇 나노초가 낭비되고 예측할 수없는 시간에 몇 나노초가 낭비되어 게임 경험을 망칠 수 있습니다. 세대 별 가비지 수집기는 예측할 수 없습니다.
앤트

2
@djacobson 나는 그것이 사실이라고 생각하지 않습니다. 내가 질문에서 말했듯이, 그것이 세대 GC를 무시하는 마이크로 소프트의 플랫폼이라면 아마도 그것은 물류 / 관료 주의적 이유 일 것이므로 묻지 않을 것입니다. 그러나 안드로이드도 같은 문제를 겪고 있기 때문에 기술적 인 이유가있을 수 있습니다. 즉, P.SE의 누군가가 확실한 대답을 할 수 있습니다.
Rei Miyasaka

3

가장 좋은 추측은 기술적 인 이유는 아니지만 해당 전화 플랫폼 개발자는 아직 노력을 기울이지 않았다는 것입니다. 나는 그것이 당신이 바라는 대답이 아니라는 것을 알고 있지만, 모바일 개발을 한 적이 있다면 아마도 매달린 과일 이 많이 있음을 알았을 것입니다 . 아마도 여러 GC 구현을 작성하고, 모두 미세 조정하고, 가장 적합한 것을 선택하는 데 시간이 없었을 것입니다. 왜 새롭고 화려하며 잘못 생각한 API를 릴리스 할 수있을 때 바퀴를 재발 명하는 데 시간을 소비해야합니까? ;)

FWIW는, 내 이론의 확인으로, 안드로이드의 새로운 런타임 (ART)는 않는 세대 GC가 그들에게있는 거 미래의 압축 GC를 가질 계획 .


2

세대 가비지 콜렉션에는 추가 비용이 있습니다.

세대 컬렉터는 오래된 오브젝트가 새로운 오브젝트를 가리키는 시점을 찾을 수 있어야합니다. 우리는 오래된 개체를 추적하여 이러한 경우를 찾을 수 없습니다. 세대 수집의 목적을 상실하기 때문입니다. 대신, 우리는 언제 이런 일이 발생했는지 감지하고 수집 단계에서이를 기록해야합니다. 어떻게 할 것인지에 관계없이 수집 프로세스에 약간의 오버 헤드가 추가됩니다.

데스크탑 시스템에서 운영 체제는 메모리 뒤에서 모든 종류의 작업을 바쁘게 수행합니다. 프로세스 간 페이지 공유, 디스크에 사용되지 않은 페이지 작성, 프로세스 간 메모리 매핑 제공 등의 기능을 지원합니다. 여기에서 사용 된 일부 기능을 통해 변경되는 포인터를보다 효율적으로 추적 할 수 있습니다. 작업은 이미 메모리에서 변경되는 내용에 대해 걱정하고 있으므로 해당 정보를 새로운 목적으로 사용하는 것은 문제가되지 않습니다.

모바일 시스템이 뒤에서 똑같은 일을하지 않는 것 같습니다. 결과적으로 데스크톱과 동일한 수준의 정보가 없습니다. 결과적으로, 일반 컬렉션을 구현하는 데 드는 오버 헤드는 더 높고 그만한 가치가 없습니다.


GC 세대를 최대한 활용하려면 쓰기 펜스를 사용하여 이전 세대 객체가 쓰여지는시기를 감지해야합니다. 다른 한편으로, GC의 "마크"부분이 세대로부터 이익을 얻지 못하더라도, 새로운 세대에서만 물건을 움직여서 (실제로, 이전 세대에서 "태그"단계를 수행함으로써) 여전히 성능을 향상시킬 수 있다고 생각합니다. 각 세대에 얼마나 많은 회수 가능한 메모리가 있는지 알 수 있다면 새로운 것이 유용 할 수 있습니다).
supercat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.