[ http://issues.apache.org/jira/browse/DIRMINA-62?page=all ]
     
Trustin Lee resolved DIRMINA-62:
--------------------------------

    Fix Version: 0.7.3
     Resolution: Fixed

Thanks for your hint! :)  It was my mistake that I didn't use allocate0().  Now 
I checked in the fix and deployed snapshot JARs.

> Memory 'Leak' when causing auto-expandable ByteBuffer to expand and change 
> buffer-pool (stack).
> -----------------------------------------------------------------------------------------------
>
>          Key: DIRMINA-62
>          URL: http://issues.apache.org/jira/browse/DIRMINA-62
>      Project: Directory MINA
>         Type: Bug
>     Versions: 0.7.2
>  Environment: Non-specific.
>     Reporter: Mark Atwell
>     Assignee: Trustin Lee
>      Fix For: 0.7.3

>
> We have been using the excellent MINA library - BTW how do you pronounce 
> this: Minner? or Minor? or...?
> Anyway, we had an apparent memory leak when using the MINA code with 
> auto-expandable ByteBuffers.
> I've tracked it down to the allocate/de-allocate algorithm and buffering.
> The problem is that we originally requested a small initial buffer and then 
> putXXX() tons of things into it, causing it to grow. However, when the buffer 
> is released (implicitly by calling ...write), the now large buffer gets 
> released to a different pool (stack). Since these are unbounded, pools, the 
> large-buffer pool just aggregates the big buffers - which practically never 
> get used.
> I originally thought that I could just release the underlying ByteBuffer when 
> the pool reaches some maximum, but no joy. It looks like I may need to rely 
> on garbage-collection kicking in, but this is far from effective (For 
> JavaSoft's Lame 'solution', see: 
> http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4879883 ). Why can't the 
> NIO class have a deallocate/release call?! Grrrr! :o(
> I believe a better/more elegant solution may be to modify 
> ByteBuffer.ensureCapacity() to also use the stack/pools rather than allocate 
> more native ByteBuffers... and I guess that this would be faster also? I've 
> tested this and it seems to work fine:
> The change is in ByteBuffer.ensureCapacity. Change:
>     java.nio.ByteBuffer newBuf = isDirect() ? 
> java.nio.ByteBuffer.allocateDirect(newCapacity) : 
> java.nio.ByteBuffer.allocate(newCapacity);
> To:
>     java.nio.ByteBuffer newBuf = allocate0(newCapacity,isDirect());
> Obviously one of the things one can do in the interim is work out (or 
> approximate/over-estimate) the maximum buffer size, but if we want to do this 
> with any degree of accuracy we need to encode our buffer first, which rather 
> defeats the purpose/benefit of the ByteBuffer.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira

Reply via email to