1
1
/*
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.
3
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
4
*
5
5
* 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)
445
445
return result;
446
446
}
447
447
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
+
448
461
bool VirtualMemoryTracker::remove_released_region (address addr, size_t size) {
449
462
assert (addr != NULL , " Invalid address" );
450
463
assert (size > 0 , " Invalid size" );
@@ -454,15 +467,17 @@ bool VirtualMemoryTracker::remove_released_region(address addr, size_t size) {
454
467
ReservedMemoryRegion* reserved_rgn = _reserved_regions->find (rgn);
455
468
456
469
assert (reserved_rgn != NULL , " No reserved region" );
470
+ if (reserved_rgn->same_region (addr, size)) {
471
+ return remove_released_region (reserved_rgn);
472
+ }
457
473
458
474
// uncommit regions within the released region
459
475
if (!reserved_rgn->remove_uncommitted_region (addr, size)) {
460
476
return false ;
461
477
}
462
478
463
479
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)) {
466
481
// This is an unmapped CDS region, which is part of the reserved shared
467
482
// memory region.
468
483
// See special handling in VirtualMemoryTracker::add_reserved_region also.
@@ -471,29 +486,25 @@ bool VirtualMemoryTracker::remove_released_region(address addr, size_t size) {
471
486
472
487
VirtualMemorySummary::record_released_memory (size, reserved_rgn->flag ());
473
488
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 ;
476
494
} 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 ;
482
505
} 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 ;
497
508
}
498
509
}
499
510
}
@@ -512,7 +523,7 @@ bool VirtualMemoryTracker::split_reserved_region(address addr, size_t size, size
512
523
NativeCallStack original_stack = *reserved_rgn->call_stack ();
513
524
MEMFLAGS original_flags = reserved_rgn->flag ();
514
525
515
- _reserved_regions-> remove (rgn );
526
+ remove_released_region (reserved_rgn );
516
527
517
528
// Now, create two new regions.
518
529
add_reserved_region (addr, split, original_stack, original_flags);
0 commit comments