--- old/src/hotspot/share/gc/g1/g1PageBasedVirtualSpace.cpp 2019-09-21 06:25:09.121962151 -0700 +++ new/src/hotspot/share/gc/g1/g1PageBasedVirtualSpace.cpp 2019-09-21 06:25:08.757962164 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,6 +23,7 @@ */ #include "precompiled.hpp" +#include "gc/g1/g1NUMA.inline.hpp" #include "gc/g1/g1PageBasedVirtualSpace.hpp" #include "gc/shared/workgroup.hpp" #include "oops/markWord.hpp" @@ -33,13 +34,13 @@ #include "utilities/align.hpp" #include "utilities/bitMap.inline.hpp" -G1PageBasedVirtualSpace::G1PageBasedVirtualSpace(ReservedSpace rs, size_t used_size, size_t page_size) : +G1PageBasedVirtualSpace::G1PageBasedVirtualSpace(ReservedSpace rs, size_t used_size, size_t page_size, MemoryType type) : _low_boundary(NULL), _high_boundary(NULL), _tail_size(0), _page_size(0), - _committed(mtGC), _dirty(mtGC), _special(false), _executable(false) { - initialize_with_page_size(rs, used_size, page_size); + _committed(mtGC), _dirty(mtGC), _special(false), _executable(false), _numa(NULL) { + initialize_with_page_size(rs, used_size, page_size, type); } -void G1PageBasedVirtualSpace::initialize_with_page_size(ReservedSpace rs, size_t used_size, size_t page_size) { +void G1PageBasedVirtualSpace::initialize_with_page_size(ReservedSpace rs, size_t used_size, size_t page_size, MemoryType type) { guarantee(rs.is_reserved(), "Given reserved space must have been reserved already."); vmassert(_low_boundary == NULL, "VirtualSpace already initialized"); @@ -70,6 +71,13 @@ } _tail_size = used_size % _page_size; + + // Set _numa only if: + // 1) This space is for java heap. + // 2) There are multiple memory nodes because some OSes allow enabling UseNUMA. + if (type == mtJavaHeap && G1MemoryNodeManager::mgr()->num_active_nodes() > 1) { + _numa = G1NUMA::numa(); + } } G1PageBasedVirtualSpace::~G1PageBasedVirtualSpace() { @@ -81,6 +89,7 @@ _executable = false; _page_size = 0; _tail_size = 0; + _numa = NULL; } size_t G1PageBasedVirtualSpace::committed_size() const { @@ -189,7 +198,7 @@ os::pretouch_memory(page_start(start_page), bounded_end_addr(end_page), _page_size); } -bool G1PageBasedVirtualSpace::commit(size_t start_page, size_t size_in_pages) { +bool G1PageBasedVirtualSpace::commit(size_t start_page, size_t size_in_pages, uint node_index) { // We need to make sure to commit all pages covered by the given area. guarantee(is_area_uncommitted(start_page, size_in_pages), "Specified area is not uncommitted"); @@ -207,6 +216,12 @@ } _committed.set_range(start_page, end_page); + if (_numa != NULL) { + char* start_addr = page_start(start_page); + size_t size_in_bytes = size_in_pages * _page_size; + _numa->touch_memory((address)start_addr, size_in_bytes, node_index); + } + return zero_filled; }