2016년 5월 13일 금요일

WebCore Resource의 handle 관리

WebCore는 Resource를 가지고 메모리를 관리한다.
Resource는 image, js, css 등 web server에서 받아온 encoded data, 그리고 그것을 '해석'한 decoded data를 모두 포함 한다.

Resource (리소스 당 하나)는
(1) ResourceFetcher (Document당 하나),
(2) ImageLoader (이미지 당 하나)
(3) MemoryCache (Render Process 당 하나)
등에서도 ResourcePtr을 통해 관리 되고 참조 된다.

이렇게 여러 Object에 의해서 참조되기 때문에 handleCount를 유지하는데, 그 handleCount가 0이 되어야 Resource::~Resource() 가 불려서 Destroy 되고 메모리에서 해제 되게 된다.

Resource Destroy에 관련 된 함수들.
unregisterHandle()
deleteIfPossible()
canDelete()

결국 handleCount를 0으로 만드는 조건을 만들어줘야 메모리를 줄일 수 있다.

[ResourceFetcher]
chrome --type=renderer (+0x512676c) [0x7f7defc4a76c]
chrome --type=renderer (+0x51269a9) [0x7f7defc4a9a9]
chrome --type=renderer (+0x4b2e894) [0x7f7def652894]
chrome --type=renderer (+0x4b2e812) [0x7f7def652812]
chrome --type=renderer (+0x52e3f9a) [0x7f7defe07f9a]
chrome --type=renderer (+0x44b40b8) [0x7f7deefd80b8]
chrome --type=renderer (+0x44b38f8) [0x7f7deefd78f8]
chrome --type=renderer (+0x44708f9) [0x7f7deef948f9]
chrome --type=renderer (+0x52fb01c) [0x7f7defe1f01c]
chrome --type=renderer (+0x440e7cc) [0x7f7deef327cc]
chrome --type=renderer (+0x4409ddd) [0x7f7deef2dddd]


sonchulmin@sonchulmin-H81MDV3:~/work/src/out/Debug$ addr2line -e chrome -afp 0x512676c
0x000000000512676c: _ZN5blink4dumpEv at ../../third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp:235
sonchulmin@sonchulmin-H81MDV3:~/work/src/out/Debug$ addr2line -e chrome -afp 0x4b2e894
0x0000000004b2e894: _ZN5blink15ResourceFetcher6createEN3WTF10PassOwnPtrINS_12FetchContextEEE at ../../third_party/WebKit/Source/core/fetch/ResourceFetcher.h:72
sonchulmin@sonchulmin-H81MDV3:~/work/src/out/Debug$ addr2line -e chrome -afp 0x4b2e812
0x0000000004b2e812: _ZN5blink17FrameFetchContext23createContextAndFetcherEPNS_14DocumentLoaderE at ../../third_party/WebKit/Source/core/loader/FrameFetchContext.h:55
sonchulmin@sonchulmin-H81MDV3:~/work/src/out/Debug$


./third_party/WebKit/Source/core/loader/DocumentLoader.cpp:    , m_fetcher(FrameFetchContext::createContextAndFetcher(this))
./third_party/WebKit/Source/core/dom/Document.cpp:        m_fetcher = FrameFetchContext::createContextAndFetcher(nullptr);

댓글 없음:

댓글 쓰기