diff -r 01522ca68fc7 -r b9d151496930 src/share/vm/memory/allocation.hpp --- a/src/share/vm/memory/allocation.hpp Tue Jun 18 12:31:07 2013 -0700 +++ b/src/share/vm/memory/allocation.hpp Tue Jun 18 22:45:32 2013 +0200 @@ -713,13 +713,21 @@ // is set so that we always use malloc except for Solaris where we set the // limit to get mapped memory. template -class ArrayAllocator : StackObj { +class ArrayAllocator VALUE_OBJ_CLASS_SPEC { char* _addr; bool _use_malloc; size_t _size; + bool _free_in_destructor; public: - ArrayAllocator() : _addr(NULL), _use_malloc(false), _size(0) { } - ~ArrayAllocator() { free(); } + ArrayAllocator(bool free_in_destructor = true) : + _addr(NULL), _use_malloc(false), _size(0), _free_in_destructor(free_in_destructor) { } + + ~ArrayAllocator() { + if (_free_in_destructor) { + free(); + } + } + E* allocate(size_t length); void free(); };