< prev index next >

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

Print this page

        

*** 29,40 **** --- 29,49 ---- #include "gc/z/zStat.hpp" #include "logging/log.hpp" static const ZStatCounter ZCounterPageCacheHitL1("Memory", "Page Cache Hit L1", ZStatUnitOpsPerSecond); static const ZStatCounter ZCounterPageCacheHitL2("Memory", "Page Cache Hit L2", ZStatUnitOpsPerSecond); + static const ZStatCounter ZCounterPageCacheHitL3("Memory", "Page Cache Hit L3", ZStatUnitOpsPerSecond); static const ZStatCounter ZCounterPageCacheMiss("Memory", "Page Cache Miss", ZStatUnitOpsPerSecond); + ZPageCacheFlushClosure::ZPageCacheFlushClosure(size_t requested) : + _requested(requested), + _flushed(0) {} + + size_t ZPageCacheFlushClosure::overflushed() const { + return _flushed > _requested ? _flushed - _requested : 0; + } + ZPageCache::ZPageCache() : _available(0), _small(), _medium(), _large() {}
*** 65,133 **** } remote_numa_id++; } - ZStatInc(ZCounterPageCacheMiss); return NULL; } ZPage* ZPageCache::alloc_medium_page() { ! ZPage* const l1_page = _medium.remove_first(); ! if (l1_page != NULL) { ZStatInc(ZCounterPageCacheHitL1); ! return l1_page; } - ZStatInc(ZCounterPageCacheMiss); return NULL; } ZPage* ZPageCache::alloc_large_page(size_t size) { // Find a page with the right size ZListIterator<ZPage> iter(&_large); ! for (ZPage* l1_page; iter.next(&l1_page);) { ! if (l1_page->size() == size) { // Page found ! _large.remove(l1_page); ZStatInc(ZCounterPageCacheHitL1); ! return l1_page; } } - ZStatInc(ZCounterPageCacheMiss); return NULL; } ZPage* ZPageCache::alloc_page(uint8_t type, size_t size) { ZPage* page; if (type == ZPageTypeSmall) { page = alloc_small_page(); } else if (type == ZPageTypeMedium) { page = alloc_medium_page(); } else { page = alloc_large_page(size); } if (page != NULL) { _available -= page->size(); } return page; } ! void ZPageCache::free_page(ZPage* page) { const uint8_t type = page->type(); if (type == ZPageTypeSmall) { _small.get(page->numa_id()).insert_first(page); } else if (type == ZPageTypeMedium) { _medium.insert_first(page); } else { _large.insert_first(page); } _available += page->size(); } bool ZPageCache::flush_list_inner(ZPageCacheFlushClosure* cl, ZList<ZPage>* from, ZList<ZPage>* to) { ZPage* const page = from->last(); --- 74,197 ---- } remote_numa_id++; } return NULL; } ZPage* ZPageCache::alloc_medium_page() { ! ZPage* const page = _medium.remove_first(); ! if (page != NULL) { ZStatInc(ZCounterPageCacheHitL1); ! return page; } return NULL; } ZPage* ZPageCache::alloc_large_page(size_t size) { // Find a page with the right size ZListIterator<ZPage> iter(&_large); ! for (ZPage* page; iter.next(&page);) { ! if (size == page->size()) { // Page found ! _large.remove(page); ZStatInc(ZCounterPageCacheHitL1); ! return page; ! } ! } ! ! return NULL; ! } ! ! ZPage* ZPageCache::alloc_oversized_medium_page(size_t size) { ! if (size <= ZPageSizeMedium) { ! return _medium.remove_first(); ! } ! ! return NULL; ! } ! ! ZPage* ZPageCache::alloc_oversized_large_page(size_t size) { ! // Find a page that is large enough ! ZListIterator<ZPage> iter(&_large); ! for (ZPage* page; iter.next(&page);) { ! if (size <= page->size()) { ! // Page found ! _large.remove(page); ! return page; } } return NULL; } + ZPage* ZPageCache::alloc_oversized_page(size_t size) { + ZPage* page = alloc_oversized_large_page(size); + if (page == NULL) { + page = alloc_oversized_medium_page(size); + } + + if (page != NULL) { + ZStatInc(ZCounterPageCacheHitL3); + } + + return page; + } + ZPage* ZPageCache::alloc_page(uint8_t type, size_t size) { ZPage* page; + // Try allocate exact page if (type == ZPageTypeSmall) { page = alloc_small_page(); } else if (type == ZPageTypeMedium) { page = alloc_medium_page(); } else { page = alloc_large_page(size); } + if (page == NULL) { + // Try allocate potentially oversized page + ZPage* const oversized = alloc_oversized_page(size); + if (oversized != NULL) { + if (size < oversized->size()) { + // Split oversized page + page = oversized->split(type, size); + + // Cache remainder + free_page_inner(oversized); + } else { + // Re-type correctly sized page + page = oversized->retype(type); + } + } + } + if (page != NULL) { _available -= page->size(); + } else { + ZStatInc(ZCounterPageCacheMiss); } return page; } ! void ZPageCache::free_page_inner(ZPage* page) { const uint8_t type = page->type(); if (type == ZPageTypeSmall) { _small.get(page->numa_id()).insert_first(page); } else if (type == ZPageTypeMedium) { _medium.insert_first(page); } else { _large.insert_first(page); } + } + void ZPageCache::free_page(ZPage* page) { + free_page_inner(page); _available += page->size(); } bool ZPageCache::flush_list_inner(ZPageCacheFlushClosure* cl, ZList<ZPage>* from, ZList<ZPage>* to) { ZPage* const page = from->last();
< prev index next >