Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

JDK-8275608: runtime/Metaspace/elastic/TestMetaspaceAllocationMT2 too slow #6041

Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
@@ -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) {
tstuefe marked this conversation as resolved.
Show resolved Hide resolved
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);