Skip to content

Commit 9116300

Browse files
author
duke
committedJul 9, 2020
Automatic merge of jdk:master into master
2 parents e966c3c + 9bac33f commit 9116300

File tree

2 files changed

+38
-26
lines changed

2 files changed

+38
-26
lines changed
 

‎src/hotspot/share/services/virtualMemoryTracker.cpp

+36-25
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2013, 2019, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2013, 2020, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -445,6 +445,19 @@ bool VirtualMemoryTracker::remove_uncommitted_region(address addr, size_t size)
445445
return result;
446446
}
447447

448+
bool VirtualMemoryTracker::remove_released_region(ReservedMemoryRegion* rgn) {
449+
assert(rgn != NULL, "Sanity check");
450+
assert(_reserved_regions != NULL, "Sanity check");
451+
452+
// uncommit regions within the released region
453+
if (!rgn->remove_uncommitted_region(rgn->base(), rgn->size())) {
454+
return false;
455+
}
456+
457+
VirtualMemorySummary::record_released_memory(rgn->size(), rgn->flag());
458+
return _reserved_regions->remove(*rgn);
459+
}
460+
448461
bool VirtualMemoryTracker::remove_released_region(address addr, size_t size) {
449462
assert(addr != NULL, "Invalid address");
450463
assert(size > 0, "Invalid size");
@@ -454,15 +467,17 @@ bool VirtualMemoryTracker::remove_released_region(address addr, size_t size) {
454467
ReservedMemoryRegion* reserved_rgn = _reserved_regions->find(rgn);
455468

456469
assert(reserved_rgn != NULL, "No reserved region");
470+
if (reserved_rgn->same_region(addr, size)) {
471+
return remove_released_region(reserved_rgn);
472+
}
457473

458474
// uncommit regions within the released region
459475
if (!reserved_rgn->remove_uncommitted_region(addr, size)) {
460476
return false;
461477
}
462478

463479
if (reserved_rgn->flag() == mtClassShared &&
464-
reserved_rgn->contain_region(addr, size) &&
465-
!reserved_rgn->same_region(addr, size)) {
480+
reserved_rgn->contain_region(addr, size)) {
466481
// This is an unmapped CDS region, which is part of the reserved shared
467482
// memory region.
468483
// See special handling in VirtualMemoryTracker::add_reserved_region also.
@@ -471,29 +486,25 @@ bool VirtualMemoryTracker::remove_released_region(address addr, size_t size) {
471486

472487
VirtualMemorySummary::record_released_memory(size, reserved_rgn->flag());
473488

474-
if (reserved_rgn->same_region(addr, size)) {
475-
return _reserved_regions->remove(rgn);
489+
assert(reserved_rgn->contain_region(addr, size), "Not completely contained");
490+
if (reserved_rgn->base() == addr ||
491+
reserved_rgn->end() == addr + size) {
492+
reserved_rgn->exclude_region(addr, size);
493+
return true;
476494
} else {
477-
assert(reserved_rgn->contain_region(addr, size), "Not completely contained");
478-
if (reserved_rgn->base() == addr ||
479-
reserved_rgn->end() == addr + size) {
480-
reserved_rgn->exclude_region(addr, size);
481-
return true;
495+
address top = reserved_rgn->end();
496+
address high_base = addr + size;
497+
ReservedMemoryRegion high_rgn(high_base, top - high_base,
498+
*reserved_rgn->call_stack(), reserved_rgn->flag());
499+
500+
// use original region for lower region
501+
reserved_rgn->exclude_region(addr, top - addr);
502+
LinkedListNode<ReservedMemoryRegion>* new_rgn = _reserved_regions->add(high_rgn);
503+
if (new_rgn == NULL) {
504+
return false;
482505
} else {
483-
address top = reserved_rgn->end();
484-
address high_base = addr + size;
485-
ReservedMemoryRegion high_rgn(high_base, top - high_base,
486-
*reserved_rgn->call_stack(), reserved_rgn->flag());
487-
488-
// use original region for lower region
489-
reserved_rgn->exclude_region(addr, top - addr);
490-
LinkedListNode<ReservedMemoryRegion>* new_rgn = _reserved_regions->add(high_rgn);
491-
if (new_rgn == NULL) {
492-
return false;
493-
} else {
494-
reserved_rgn->move_committed_regions(addr, *new_rgn->data());
495-
return true;
496-
}
506+
reserved_rgn->move_committed_regions(addr, *new_rgn->data());
507+
return true;
497508
}
498509
}
499510
}
@@ -512,7 +523,7 @@ bool VirtualMemoryTracker::split_reserved_region(address addr, size_t size, size
512523
NativeCallStack original_stack = *reserved_rgn->call_stack();
513524
MEMFLAGS original_flags = reserved_rgn->flag();
514525

515-
_reserved_regions->remove(rgn);
526+
remove_released_region(reserved_rgn);
516527

517528
// Now, create two new regions.
518529
add_reserved_region(addr, split, original_stack, original_flags);

‎src/hotspot/share/services/virtualMemoryTracker.hpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2013, 2019, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2013, 2020, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -382,6 +382,7 @@ class VirtualMemoryTracker : AllStatic {
382382
static bool add_committed_region (address base_addr, size_t size, const NativeCallStack& stack);
383383
static bool remove_uncommitted_region (address base_addr, size_t size);
384384
static bool remove_released_region (address base_addr, size_t size);
385+
static bool remove_released_region (ReservedMemoryRegion* rgn);
385386
static void set_reserved_region_type (address addr, MEMFLAGS flag);
386387

387388
// Given an existing memory mapping registered with NMT, split the mapping in

0 commit comments

Comments
 (0)
Please sign in to comment.