Skip to content
Permalink
Browse files
8275608: runtime/Metaspace/elastic/TestMetaspaceAllocationMT2 too slow
Backport-of: d6d82f52d4a4fac037ee9424503f8b7f11a61c40
  • Loading branch information
tstuefe committed Jan 26, 2022
1 parent 096c31c commit a93e5efee2fc5807444c5720d31451d600022662
Showing 5 changed files with 33 additions and 28 deletions.
@@ -25,8 +25,6 @@

import sun.hotspot.WhiteBox;

import java.util.concurrent.atomic.AtomicLong;

public class MetaspaceTestArena {

long arena;
@@ -38,7 +36,7 @@ public class MetaspaceTestArena {
long numAllocated = 0;
long deallocatedWords = 0;
long numDeallocated = 0;
long numAllocationFailures = 0;
volatile long numAllocationFailures = 0;

private synchronized boolean reachedCeiling() {
return (allocatedWords - deallocatedWords) > allocationCeiling;
@@ -1,6 +1,6 @@
/*
* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2020 SAP SE. All rights reserved.
* Copyright (c) 2021 SAP SE. All rights reserved.
* Copyright (c) 2021, 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
@@ -63,7 +63,7 @@ public void runTest() throws Exception {
Thread.sleep(200);

for (RandomAllocatorThread t: threads) {
if (t.allocator.arena.numAllocationFailures > 0) {
if (t.allocator.arena.numAllocationFailures > 1000) {
t.interrupt();
t.join();
context.destroyArena(t.allocator.arena);
@@ -1,6 +1,6 @@
/*
* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2020 SAP SE. All rights reserved.
* Copyright (c) 2021 SAP SE. All rights reserved.
* Copyright (c) 2021, 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,8 +23,6 @@
*
*/

import java.util.Set;

public class MetaspaceTestWithThreads {

// The context to use.
@@ -53,6 +51,8 @@ protected void stopAllThreads() throws InterruptedException {
// Stop all threads.
for (Thread t: threads) {
t.interrupt();
}
for (Thread t: threads) {
t.join();
}
}
@@ -1,6 +1,6 @@
/*
* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2020 SAP SE. All rights reserved.
* Copyright (c) 2021 SAP SE. All rights reserved.
* Copyright (c) 2021, 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
@@ -46,7 +46,11 @@ public class RandomAllocator {
ArrayList<Allocation> to_dealloc = new ArrayList<>();

long ticks = 0;
boolean allocationError = false;

// Allocate (breathe in) until arena is full, then - to test the arena deallocator - deallocate some allocations
// and breathe in again until full.
boolean breatheIn = true;
int breatheOutTicks = 0;

Random localRandom;

@@ -57,15 +61,16 @@ private boolean rollDice(double probability) {

// Allocate a random amount from the arena. If dice hits right, add this to the deallocation list.
void allocateRandomly() {
allocationError = false;
long word_size = profile.randomAllocationSize();
Allocation a = arena.allocate(word_size);
if (a != null) {
if (to_dealloc.size() < 10000) {
to_dealloc.add(a);
}
} else {
allocationError = true;
// On allocation error, breathe out a bit
breatheIn = false;
breatheOutTicks = 0;
}
}

@@ -80,19 +85,20 @@ void deallocateRandomly() {
}

public void tick() {

if (!allocationError) {
if (breatheIn) {
// allocate until we hit the ceiling
allocateRandomly();
if(rollDice(profile.randomDeallocProbability)) {
if (rollDice(profile.randomDeallocProbability)) {
deallocateRandomly();
}
} else {
deallocateRandomly();
allocationError = false;
if (++breatheOutTicks < 100) {
deallocateRandomly();
} else {
breatheIn = true;
}
}

ticks ++;

}

public RandomAllocator(MetaspaceTestArena arena) {
@@ -102,6 +108,10 @@ public RandomAllocator(MetaspaceTestArena arena) {
this.localRandom = new Random(RandomHelper.random().nextInt());
}

long numAllocationFailures() {
return arena.numAllocationFailures;
}

@Override
public String toString() {
return arena.toString() + ", ticks=" + ticks;
@@ -1,6 +1,6 @@
/*
* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2020 SAP SE. All rights reserved.
* Copyright (c) 2021 SAP SE. All rights reserved.
* Copyright (c) 2021, 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,7 +23,6 @@
*
*/

import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

@@ -55,9 +54,7 @@ public void run() {
}

while (!Thread.interrupted()) {
for (int i = 0; i < 1000; i++) {
allocator.tick();
}
allocator.tick();
}

// System.out.println("+ [" + id + "] " + allocator);

1 comment on commit a93e5ef

@openjdk-notifier
Copy link

@openjdk-notifier openjdk-notifier bot commented on a93e5ef Jan 26, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.