Robert Stupp created CASSANDRA-11870:
----------------------------------------

             Summary: Consider allocating direct buffers bypassing 
ByteBuffer.allocateDirect
                 Key: CASSANDRA-11870
                 URL: https://issues.apache.org/jira/browse/CASSANDRA-11870
             Project: Cassandra
          Issue Type: Improvement
            Reporter: Robert Stupp
            Priority: Minor


As outlined in CASSANDRA-11818, {{ByteBuffer.allocateDirect}} uses 
{{Bits.reserveMemory}}, which is there to respect the JVM setting 
{{-XX:MaxDirectMemorySize=...}}.

{{Bits.reserveMemory}} first tries an "optimistic" {{tryReserveMemory}} and 
exits immediately on success. However, if that somehow doesn't succeed, it 
triggers a {{System.gc()}}, which is bad IMO (however, kind of how direct 
buffers work in Java). After that GC it sleeps and tries to reserve the memory 
up to 9 times - up to 511 ms - and then throws {{OutOfMemoryError("Direct 
buffer memory")}}.

This is unnecessary for us since we always immediately "free" direct buffers as 
soon as we no longer need them.

Proposal: Manage direct-memory reservations in our own code and skip 
{{Bits.reserveMemory}} that way.

(However, Netty direct buffers are not under our control.)



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to