< prev index next >

src/hotspot/share/gc/z/zCollectedHeap.cpp

Print this page

        

*** 21,41 **** --- 21,108 ---- * questions. */ #include "precompiled.hpp" #include "gc/shared/gcHeapSummary.hpp" + #include "gc/shared/memAllocator.hpp" #include "gc/shared/suspendibleThreadSet.hpp" #include "gc/z/zCollectedHeap.hpp" #include "gc/z/zGlobals.hpp" #include "gc/z/zHeap.inline.hpp" #include "gc/z/zNMethod.hpp" #include "gc/z/zServiceability.hpp" #include "gc/z/zStat.hpp" #include "gc/z/zUtils.inline.hpp" #include "memory/universe.hpp" + #include "runtime/interfaceSupport.inline.hpp" #include "runtime/mutexLocker.hpp" + class PinAllocating { + private: + const HeapWord* _mem; + public: + PinAllocating(HeapWord* mem) : + _mem(mem) { + ZHeap::heap()->pin_allocating((uintptr_t)_mem); + } + + ~PinAllocating() { + ZHeap::heap()->unpin_allocating((uintptr_t)_mem); + } + }; + + class ZObjArrayAllocator: public ObjArrayAllocator { + private: + const bool _is_large; + const size_t _chunk_size; + + void mem_clear_large(HeapWord* mem) const { + log_info(gc)("ZMemClearer " PTR_FORMAT " " SIZE_FORMAT " M", p2i(mem), _word_size * BytesPerWord / M); + assert(mem != NULL, "cannot initialize NULL object"); + const size_t hs = oopDesc::header_size(); + assert(_word_size >= hs, "unexpected object size"); + oopDesc::set_klass_gap(mem, 0); + + PinAllocating pin_allocating(mem); + + size_t offset = hs; + while (offset + _chunk_size < _word_size) { + Copy::fill_to_aligned_words(mem + offset, _chunk_size); + offset += _chunk_size; + + { + ThreadBlockInVM tbivm(JavaThread::current()); + } + + // Fix colors + mem = (HeapWord*)ZAddress::good((uintptr_t)mem); + } + + if (offset < _word_size) { + Copy::fill_to_aligned_words(mem + offset, _word_size - offset); + } + } + + protected: + virtual HeapWord* mem_clear(HeapWord* mem) const { + if (_is_large) { + mem_clear_large(mem); + } else { + mem = ObjArrayAllocator::mem_clear(mem); + } + return (HeapWord*)ZAddress::good((uintptr_t)mem); + } + + public: + ZObjArrayAllocator(Klass* klass, size_t word_size, int length, bool do_zero, + Thread* thread = Thread::current()) : + ObjArrayAllocator(klass, word_size, length, do_zero, thread), + _is_large(static_cast<size_t>(length) > ZObjectSizeLimitMedium), + _chunk_size(ZObjectSizeLimitMedium / BytesPerWord) + {} + }; + ZCollectedHeap* ZCollectedHeap::heap() { CollectedHeap* heap = Universe::heap(); assert(heap != NULL, "Uninitialized access to ZCollectedHeap::heap()"); assert(heap->kind() == CollectedHeap::Z, "Invalid name"); return (ZCollectedHeap*)heap;
*** 125,134 **** --- 192,206 ---- } return (HeapWord*)addr; } + oop ZCollectedHeap::array_allocate(Klass* klass, int size, int length, bool do_zero, TRAPS) { + ZObjArrayAllocator allocator(klass, size, length, do_zero, THREAD); + return allocator.allocate(); + } + HeapWord* ZCollectedHeap::mem_allocate(size_t size, bool* gc_overhead_limit_was_exceeded) { const size_t size_in_bytes = ZUtils::words_to_bytes(align_object_size(size)); return (HeapWord*)_heap.alloc_object(size_in_bytes); }
< prev index next >