Memory management
블링크에 관한한, 다음의 세가지 메모리 관리자에 대하여 주의해야 합니다:
- PartitionAlloc
- Oilpan (a.k.a. Blink GC)
- malloc (discouraged)
USING_FAST_MALLOC()을 사용하여 PartitionAlloc의 힙메모리에 객체를 생성할 수 있습니다:
class SomeObject {
USING_FAST_MALLOC(SomeObject);
static std::unique_ptr<SomeObject> Create() {
return std::make_unique<SomeObject>(); // Allocated on PartitionAlloc's heap.
}
};
PartitionAlloc에 의해 생성된 객체의 생애주기는 scoped_refptr<> 또는 std::unique_ptr<>로 관리되어야 합니다.
GarbageCollected를 이용하여 Oilpan의 힙에 객체를 생성할 수도 있습니다:
class SomeObject : public GarbageCollected<SomeObject> {
static SomeObject* Create() {
return new SomeObject; // Allocated on Oilpan's heap.
}
};
Oilpan에 의해 생성된 객체의 생애주기는 가비지콜렉션(GC)에 의해 자동으로 관리됩니다. Oilpan의 힙에 있는 객체를 가리키기 위해서는 특별한 포인터(예, Member<>, Persistent<>)를 사용해야 합니다. 여기서 가장 중요한 제약사항은 Oilpan 객체의 소멸자(destructor)에서는 다른 Oilpan 객체에 접근할 수 없다는 것입니다(왜냐하면 객체들의 소멸 순서가 명확하지 않기 때문입니다).
USING_FAST_MALLOC()도 GarbageCollected도 사용하지 않는다면, 객체는 시스템 malloc 힙에 생성됩니다. 블링크에서는 이렇게 사용하지 말것을 강력히 권고합니다.
- Oilpan을 기본으로 사용합니다.
- PartitionAlloc은 다음의 경우에만 사용합니다. 1) 객체의 생애주기가 아주 명확하고 std:unique_ptr<>로도 충분할 경우, 2) Oilpan에 객체를 할당하면 많은 복잡성이 발생하는 경우, 3) Oilpan에 객체를 할당하게되면 런타임에 불필요한 GC가 많이 일어나는 경우.
PartitionAlloc와 Oilpan 중 어떤 것을 사용하건, 매달린 포인터(Dangling Pointer - 이미 해제된 메모리 영역을 가리키고 있는 포인터)가 생성되거나 메모리 누수가 발생하지 않도록 정말 주의해야 합니다.(참고: 원시포인터는 강력히 비추천)
If you want to learn more:
- How to use PartitionAlloc: platform/wtf/allocator/Allocator.md
- How to use Oilpan: platform/heap/BlinkGCAPIReference.md
- Oilpan GC design: platform/heap/BlinkGCDesign.md