RFR: 8141501: Problems with BitMap buffer management
Stefan Karlsson
stefan.karlsson at oracle.com
Thu Apr 28 13:23:48 UTC 2016
Hi all,
I decided to restructure the allocation code a bit to get better
separation between the bitmap allocation logic and the actual bitmap
memory allocators.
http://cr.openjdk.java.net/~stefank/8141501/webrev.02.delta
http://cr.openjdk.java.net/~stefank/8141501/webrev.02
BitMap has now the following allocation functions: reallocate, allocate,
and free. These functions take care of the high-level handling of the
BitMap allocations: requesting, copying, clearing, and releasing memory.
The low-level allocation and freeing of memory are handled by the
ResourceBitMapAllocator, CHeapBitMapAllocator, and ArenaBitMapAllocator
classes.
I've also moved the implementation of resize, initialize, and
reinitialize into protected functions in BitMap. The sub-classes then
expose public version of these functions, and pass down the appropriate
allocator instances to the protected BitMap versions.
The current patch does not provide resize, initialize and reinitialize
functions for the ArenaBitMaps, since that requires an extra field in
all ArenaBitMaps. If we decide that that's not a real problem, we could
easily introduce that as a separate patch. See:
http://cr.openjdk.java.net/~stefank/8141501/webrev.02.resizableArenaBitMaps/
While implementing the above patches I realized that the ResourceBitMaps
actually are cleared in the constructor, so the previous comments were
wrong and I've updated the comments accordingly. But this also means
that the ResourceBitMap map(size); map.clear(); pattern, which can be
seen mainly in the compiler code, clears the bitmaps twice. I've created
the following CR to track that:
https://bugs.openjdk.java.net/browse/JDK-8155638 - Resource allocated
BitMaps are often cleared twice
Thanks,
StefanK
On 2016-04-27 13:57, Stefan Karlsson wrote:
> Hi all,
>
> Please review this patch to change how the backing storage of BitMaps
> are managed.
>
> http://cr.openjdk.java.net/~stefank/8141501/webrev.01
> https://bugs.openjdk.java.net/browse/JDK-8141501
>
> The patch changes BitMap into an abstract base class, with concrete
> sub-classes that manages the underlying bitmap backing storage.
>
> The proposed BitMap classes are:
>
> - BitMap - the abstract base class
> - ResourceBitMap - bitmap with resource area allocated backing storage
> - ArenaBitMap - bitmap with arena allocated backing storage
> - CHeapBitMap - bitmap with CHeap allocated backing storage
> - BitMapView - bitmap without the ownership of the backing storage
>
> This will hopefully make it less likely to use the BitMaps
> incorrectly. Previously, it was possible to write the following broken
> code:
>
> // CHeap allocate.
> BitMap map(BITMAP_SIZE / 2, false);
>
> // Resource allocate.
> // The CHeap memory is leaked.
> map.resize(BITMAP_SIZE);
>
> and:
>
> // Resource allocate.
> BitMap map(BITMAP_SIZE / 2);
>
> // CHeap allocate.
> // CHeap freeing Resource allocated memory => memory stomping
> map.resize(BITMAP_SIZE, false);
>
> The stricter typing of the new BitMap sub-classes prevents these
> classes of bugs.
>
> Further motivation for this patch can be found in:
> https://bugs.openjdk.java.net/browse/JDK-8141501
>
> Tested with JPRT and ExecuteInternalVMTests.
>
> Thanks Kim for providing offline feedback on different revisions of
> this patch.
>
> This changes code in mostly the GC and Compiler parts of the JVM, so
> it would be good to get reviews from those groups.
>
> Thanks,
> StefanK
More information about the hotspot-dev
mailing list