Bug 224193 - WebSocketChannel buffers use memory after going idle (64K wasted on facebook.com
Summary: WebSocketChannel buffers use memory after going idle (64K wasted on facebook.com
Status: RESOLVED FIXED
Alias: None
Product: WebKit
Classification: Unclassified
Component: WebCore Misc. (show other bugs)
Version: Safari Technology Preview
Hardware: Unspecified Unspecified
: P2 Normal
Assignee: Alex Christensen
URL:
Keywords: InRadar
Depends on:
Blocks:
 
Reported: 2021-04-05 11:39 PDT by Simon Fraser (smfr)
Modified: 2021-04-05 19:19 PDT (History)
6 users (show)

See Also:


Attachments
Patch (1.35 KB, patch)
2021-04-05 12:02 PDT, Alex Christensen
no flags Details | Formatted Diff | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Simon Fraser (smfr) 2021-04-05 11:39:09 PDT
After loading Facebook, opening messenger, and then dumping stats:

Wasted capacity: 64586 bytes (used 0 of 64586 bytes, utilization: 0.00%) - 1 allocations, entry size 1 bytes
5   0x11b5e6858 WTF::VectorBuffer<char, 0ul, WTF::FastMalloc>::VectorBuffer()
6   0x11b5e6818 WTF::Vector<char, 0ul, WTF::CrashOnOverflow, 16ul, WTF::FastMalloc>::Vector()
7   0x11b5e6355 WTF::Vector<char, 0ul, WTF::CrashOnOverflow, 16ul, WTF::FastMalloc>::Vector()
8   0x11dbcdb50 WebCore::WebSocketChannel::WebSocketChannel(WebCore::Document&, WebCore::WebSocketChannelClient&, WebCore::SocketProvider&)
9   0x11dbce07d WebCore::WebSocketChannel::WebSocketChannel(WebCore::Document&, WebCore::WebSocketChannelClient&, WebCore::SocketProvider&)
10  0x11dbc6f6b WebCore::WebSocketChannel::create(WebCore::Document&, WebCore::WebSocketChannelClient&, WebCore::SocketProvider&)
11  0x11dbc6efe WebCore::ThreadableWebSocketChannel::create(WebCore::Document&, WebCore::WebSocketChannelClient&, WebCore::SocketProvider&)
12  0x11dbc70b1 WebCore::ThreadableWebSocketChannel::create(WebCore::ScriptExecutionContext&, WebCore::WebSocketChannelClient&, WebCore::SocketProvider&)
13  0x11dbca216 WebCore::WebSocket::connect(WTF::String const&, WTF::Vector<WTF::String, 0ul, WTF::CrashOnOverflow, 16ul, WTF::FastMalloc> const&)
14  0x11dbc978b WebCore::WebSocket::create(WebCore::ScriptExecutionContext&, WTF::String const&, WTF::Vector<WTF::String, 0ul, WTF::CrashOnOverflow, 16ul, WTF::FastMalloc> const&)
15  0x11cdd1bdb WebCore::constructJSWebSocket1(JSC::JSGlobalObject*, JSC::CallFrame*)
16  0x11cdd16bd WebCore::JSDOMConstructor<WebCore::JSWebSocket>::construct(JSC::JSGlobalObject*, JSC::CallFrame*)
17  0x13aa379b5 JSC::NativeFunction::operator()(JSC::JSGlobalObject*, JSC::CallFrame*)
18  0x13aa378c2 JSC::TaggedNativeFunction::operator()(JSC::JSGlobalObject*, JSC::CallFrame*)
19  0x13aaba43a JSC::LLInt::handleHostCall(JSC::CallFrame*, JSC::JSValue, JSC::CodeSpecializationKind)
20  0x13aab948a JSC::LLInt::setUpCall(JSC::CallFrame*, JSC::CodeSpecializationKind, JSC::JSValue, JSC::LLIntCallLinkInfo*)
21  0x13aaaa443 JSC::SlowPathReturnType JSC::LLInt::genericCall<JSC::OpConstruct>(JSC::CodeBlock*, JSC::CallFrame*, JSC::OpConstruct&&, JSC::CodeSpecializationKind, unsigned int)
Comment 1 Simon Fraser (smfr) 2021-04-05 11:40:40 PDT
^ that's the allocation site of the vector.
Comment 2 Simon Fraser (smfr) 2021-04-05 11:50:30 PDT
m_buffer never shrinks:

WebSocketChannel 0x155454780 processBuffer() Receive buffer has 166 bytes (capacity 166)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 6 bytes (capacity 166)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 7 bytes (capacity 166)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 7 bytes (capacity 166)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 7 bytes (capacity 166)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 7 bytes (capacity 166)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 6 bytes (capacity 166)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 91 bytes (capacity 166)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 141 bytes (capacity 166)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 6 bytes (capacity 166)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 91 bytes (capacity 166)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 91 bytes (capacity 166)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 91 bytes (capacity 166)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 14 bytes (capacity 166)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 7 bytes (capacity 166)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 751 bytes (capacity 751)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 4 bytes (capacity 751)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 6 bytes (capacity 751)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 6 bytes (capacity 751)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 6 bytes (capacity 751)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 232 bytes (capacity 751)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 141 bytes (capacity 751)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 232 bytes (capacity 751)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 141 bytes (capacity 751)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 232 bytes (capacity 751)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 141 bytes (capacity 751)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 91 bytes (capacity 751)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 91 bytes (capacity 751)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 91 bytes (capacity 751)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 6 bytes (capacity 751)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 328 bytes (capacity 751)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 237 bytes (capacity 751)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 91 bytes (capacity 751)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 284 bytes (capacity 751)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 6 bytes (capacity 751)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 6 bytes (capacity 751)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 232 bytes (capacity 751)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 141 bytes (capacity 751)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 232 bytes (capacity 751)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 141 bytes (capacity 751)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 91 bytes (capacity 751)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 91 bytes (capacity 751)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 4 bytes (capacity 751)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 4 bytes (capacity 751)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 6 bytes (capacity 751)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 232 bytes (capacity 751)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 141 bytes (capacity 751)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 13 bytes (capacity 751)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 7 bytes (capacity 751)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 91 bytes (capacity 751)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 6 bytes (capacity 751)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 406 bytes (capacity 751)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 6 bytes (capacity 751)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 420 bytes (capacity 751)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 6 bytes (capacity 751)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 6 bytes (capacity 751)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 1024 bytes (capacity 1024)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 1500 bytes (capacity 1500)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 2524 bytes (capacity 2524)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 3548 bytes (capacity 3548)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 4064 bytes (capacity 4436)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 5088 bytes (capacity 5546)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 6112 bytes (capacity 6933)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 7136 bytes (capacity 8667)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 8128 bytes (capacity 8667)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 9152 bytes (capacity 10834)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 10176 bytes (capacity 10834)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 11200 bytes (capacity 13543)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 12192 bytes (capacity 13543)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 13216 bytes (capacity 13543)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 14240 bytes (capacity 16929)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 15264 bytes (capacity 16929)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 16288 bytes (capacity 16929)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 16384 bytes (capacity 16929)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 17408 bytes (capacity 21162)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 17884 bytes (capacity 21162)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 18908 bytes (capacity 21162)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 19932 bytes (capacity 21162)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 20448 bytes (capacity 21162)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 21472 bytes (capacity 26453)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 22496 bytes (capacity 26453)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 23520 bytes (capacity 26453)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 24512 bytes (capacity 26453)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 24708 bytes (capacity 26453)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 397 bytes (capacity 26453)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 6 bytes (capacity 26453)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 6 bytes (capacity 26453)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 280 bytes (capacity 26453)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 6 bytes (capacity 26453)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 280 bytes (capacity 26453)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 6 bytes (capacity 26453)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 909 bytes (capacity 26453)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 1024 bytes (capacity 26453)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 1500 bytes (capacity 26453)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 2524 bytes (capacity 26453)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 3548 bytes (capacity 26453)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 4064 bytes (capacity 26453)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 5088 bytes (capacity 26453)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 6112 bytes (capacity 26453)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 6907 bytes (capacity 26453)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 1024 bytes (capacity 26453)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 1500 bytes (capacity 26453)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 2524 bytes (capacity 26453)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 3548 bytes (capacity 26453)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 4288 bytes (capacity 26453)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 282 bytes (capacity 26453)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 908 bytes (capacity 26453)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 6 bytes (capacity 26453)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 705 bytes (capacity 26453)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 4 bytes (capacity 26453)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 6 bytes (capacity 26453)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 6 bytes (capacity 26453)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 6 bytes (capacity 26453)
WebSocketChannel 0x155454780 processBuffer() Receive buffer has 459 bytes (capacity 26453)
Comment 3 Alex Christensen 2021-04-05 12:02:43 PDT
Created attachment 425183 [details]
Patch
Comment 4 Radar WebKit Bug Importer 2021-04-05 12:14:57 PDT
<rdar://problem/76228597>
Comment 5 EWS 2021-04-05 18:13:50 PDT
commit-queue failed to commit attachment 425183 [details] to WebKit repository. To retry, please set cq+ flag again.
Comment 6 EWS 2021-04-05 19:19:39 PDT
Committed r275477: <https://commits.webkit.org/r275477>

All reviewed patches have been landed. Closing bug and clearing flags on attachment 425183 [details].