Projects
Mega:24.03:SP1:Everything
openjdk-1.8.0
_service:tar_scm:0007-8241670-Enhance-heap-regi...
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File _service:tar_scm:0007-8241670-Enhance-heap-region-size-ergonomics-to-impro.patch of Package openjdk-1.8.0
Date: Mon, 5 Jun 2023 20:12:44 +0800 Subject: [PATCH 07/59] 8241670: Enhance heap region size ergonomics to improve OOTB performance --- .../g1/g1CollectorPolicy.cpp | 3 +- .../vm/gc_implementation/g1/heapRegion.cpp | 29 ++++++++----------- .../vm/gc_implementation/g1/heapRegion.hpp | 3 +- .../gc_implementation/g1/heapRegionBounds.hpp | 3 +- .../gc/arguments/TestG1HeapRegionSize.java | 3 +- 5 files changed, 20 insertions(+), 21 deletions(-) diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp index 05ce59987..0acdd2b69 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp @@ -1,5 +1,6 @@ /* * Copyright (c) 2001, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, Huawei Technologies Co., Ltd. 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 @@ -184,7 +185,7 @@ G1CollectorPolicy::G1CollectorPolicy() : // the region size on the heap size, but the heap size should be // aligned with the region size. To get around this we use the // unaligned values for the heap. - HeapRegion::setup_heap_region_size(InitialHeapSize, MaxHeapSize); + HeapRegion::setup_heap_region_size(MaxHeapSize); HeapRegionRemSet::setup_remset_size(); G1ErgoVerbose::initialize(); diff --git a/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp b/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp index 87cc73bee..28b21a9be 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp @@ -1,5 +1,6 @@ /* * Copyright (c) 2001, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, Huawei Technologies Co., Ltd. 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 @@ -107,29 +108,23 @@ size_t HeapRegion::max_region_size() { return HeapRegionBounds::max_size(); } -void HeapRegion::setup_heap_region_size(size_t initial_heap_size, size_t max_heap_size) { - uintx region_size = G1HeapRegionSize; - if (FLAG_IS_DEFAULT(G1HeapRegionSize)) { - size_t average_heap_size = (initial_heap_size + max_heap_size) / 2; - region_size = MAX2(average_heap_size / HeapRegionBounds::target_number(), +void HeapRegion::setup_heap_region_size(size_t max_heap_size) { + uintx region_size = G1HeapRegionSize; + // G1HeapRegionSize = 0 means decide ergonomically. + if (region_size == 0) { + region_size = MAX2(max_heap_size / HeapRegionBounds::target_number(), (uintx) HeapRegionBounds::min_size()); } - int region_size_log = log2_long((jlong) region_size); - // Recalculate the region size to make sure it's a power of - // 2. This means that region_size is the largest power of 2 that's - // <= what we've calculated so far. - region_size = ((uintx)1 << region_size_log); + // Make sure region size is a power of 2. Rounding up since this + // is beneficial in most cases. + region_size = is_power_of_2(region_size) ? region_size : (size_t)1 << (log2_intptr(region_size) + 1); // Now make sure that we don't go over or under our limits. - if (region_size < HeapRegionBounds::min_size()) { - region_size = HeapRegionBounds::min_size(); - } else if (region_size > HeapRegionBounds::max_size()) { - region_size = HeapRegionBounds::max_size(); - } + region_size = MIN2(MAX2(region_size, HeapRegionBounds::min_size()), HeapRegionBounds::max_size()); - // And recalculate the log. - region_size_log = log2_long((jlong) region_size); + // Calculate the log for the region size. + int region_size_log = exact_log2_long((jlong)region_size); // Now, set up the globals. guarantee(LogOfHRGrainBytes == 0, "we should only set it once"); diff --git a/hotspot/src/share/vm/gc_implementation/g1/heapRegion.hpp b/hotspot/src/share/vm/gc_implementation/g1/heapRegion.hpp index 5d2415e84..4e0afbac1 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/heapRegion.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegion.hpp @@ -1,5 +1,6 @@ /* * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, Huawei Technologies Co., Ltd. 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 @@ -333,7 +334,7 @@ class HeapRegion: public G1OffsetTableContigSpace { // CardsPerRegion). All those fields are considered constant // throughout the JVM's execution, therefore they should only be set // up once during initialization time. - static void setup_heap_region_size(size_t initial_heap_size, size_t max_heap_size); + static void setup_heap_region_size(size_t max_heap_size); // All allocated blocks are occupied by objects in a HeapRegion bool block_is_obj(const HeapWord* p) const; diff --git a/hotspot/src/share/vm/gc_implementation/g1/heapRegionBounds.hpp b/hotspot/src/share/vm/gc_implementation/g1/heapRegionBounds.hpp index 1da7f24c1..c76dead88 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/heapRegionBounds.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegionBounds.hpp @@ -1,5 +1,6 @@ /* * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, Huawei Technologies Co., Ltd. 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 @@ -40,7 +41,7 @@ private: static const size_t MAX_REGION_SIZE = 32 * 1024 * 1024; // The automatic region size calculation will try to have around this - // many regions in the heap (based on the min heap size). + // many regions in the heap. static const size_t TARGET_REGION_NUMBER = 2048; public: diff --git a/hotspot/test/gc/arguments/TestG1HeapRegionSize.java b/hotspot/test/gc/arguments/TestG1HeapRegionSize.java index 0442d2c61..a9b5fa0cb 100644 --- a/hotspot/test/gc/arguments/TestG1HeapRegionSize.java +++ b/hotspot/test/gc/arguments/TestG1HeapRegionSize.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. +* Copyright (c) 2022, Huawei Technologies Co., Ltd. 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 @@ -28,7 +29,7 @@ * @summary Verify that the flag G1HeapRegionSize is updated properly * @run main/othervm -Xmx64m TestG1HeapRegionSize 1048576 * @run main/othervm -XX:G1HeapRegionSize=2m -Xmx64m TestG1HeapRegionSize 2097152 - * @run main/othervm -XX:G1HeapRegionSize=3m -Xmx64m TestG1HeapRegionSize 2097152 + * @run main/othervm -XX:G1HeapRegionSize=3m -Xmx64m TestG1HeapRegionSize 4194304 * @run main/othervm -XX:G1HeapRegionSize=64m -Xmx256m TestG1HeapRegionSize 33554432 */ -- 2.22.0
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.
浙ICP备2022010568号-2