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)