[
https://issues.apache.org/jira/browse/QPID-7272?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15543463#comment-15543463
]
Keith Wall commented on QPID-7272:
----------------------------------
I can see three ways to fix this:
# {{MessageConverter#convert()}} methods produce a {{ServerMessage}} which
encapsulates a {{StoredMessage}}. StoredMessages have a #remove() method. We
could give the #remove responsibility for disposing any QBBs allocated by the
converter. The disadvantage with this is the ConsumerTargets need to remember
to call #remove on StoredMessages that arise from conversion, but otherwise
not. This seems ugly. Also this approach seems unpleasant for another reason:
a converted {{ServerMessage}} exposes the message's content but it does not
own it. I might expect that calling #remove would also dispose the content,
but it would not.
# Add method {{MessageConverter#dispose(N)}} which would accept a
{{ServerMessage}} that was previously produced by the same converter. The
{{#dispose()}} implementation would know how to dispose ServerMessages that it
produced. The {{ConsumerTarget#send}} would need to keep a reference to the
converter and remember to call {{MessageConverter#dispose(N)}} once the message
is passed to the protocol layer.
# Make the {{MessageConverter}} stateful. It would remember the resources that
it produced and need to be released. The {{ConsumerTarget}} would call
{{MessageConverter#releaseResources}} after the converted message is passed to
the protocol layer. To avoid creating per-message converter garbage, the
{{ConsumerTarget}} would need to cache the MessageConverters that it had used
so far. For this the MessageConverterRegistry would need to turn into a
MessageConverterFactoryRegistry.
I am in favour 2). I think this will be unobtrusive change and could be
incorporated in 6.1.
> [Java Broker] Direct memory QpidByteBuffer created in message conversion
> modules should be disposed as soon as possible after becoming unused
> ---------------------------------------------------------------------------------------------------------------------------------------------
>
> Key: QPID-7272
> URL: https://issues.apache.org/jira/browse/QPID-7272
> Project: Qpid
> Issue Type: Bug
> Components: Java Broker
> Affects Versions: qpid-java-6.0
> Reporter: Alex Rudyy
> Fix For: qpid-java-7.0.0
>
>
> Direct memory QpidByteBuffer in
> MessageConverter_to_1_0#convertServerMessage(...) is not disposed
> programmatically. We rely on GC to release it from memory when it became
> unused. There is a risk that when such QpidByteBuffers are not "garbage
> collected" soon enough Broker might run out of direct memory on heavy loads.
> Currently a user who relies heavily of message conversion with high rates of
> message flow, may see an OOM direct.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]