// Test that we don't repeatedly trigger last-ditch GCs.
// Turn of any zeal which will disrupt GC number checks.
gczeal(0);
function allocUntilFail() {
gc(null , 'shrinking' );
const initialSize = gcparam("gcBytes" );
const initialMaxSize = gcparam("maxBytes" );
const initGCNumber = gcparam("majorGCNumber" );
// Set a small heap limit.
gcparam("maxBytes" , initialSize + 16 * 1024);
let error;
try {
let a = [];
while (true ) {
a.push(Symbol()); // Symbols are tenured.
}
} catch (err) {
error = err;
}
const finalGCNumber = gcparam("majorGCNumber" );
// Resetore heap limit.
gcparam("maxBytes" , initialMaxSize);
gc();
assertEq(error, "out of memory" );
return finalGCNumber - initGCNumber;
}
// Set the time limit for skipping last ditch GCs to 5 seconds.
gcparam("minLastDitchGCPeriod" , 5);
assertEq(gcparam("minLastDitchGCPeriod" ), 5);
// Allocate up to the heap limit. This triggers a last ditch GC.
let gcCount = allocUntilFail();
assertEq(gcCount, 1)
// Allocate up to the limit again. The second time we fail without
// triggering a GC.
gcCount = allocUntilFail();
assertEq(gcCount, 0)
// Wait for time limit to expire.
sleep(6);
// Check we trigger a GC again.
gcCount = allocUntilFail();
assertEq(gcCount, 1)
Messung V0.5 C=80 H=82 G=80
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet)
¤
*© Formatika GbR, Deutschland