/*
* This file is part of the Jikes RVM project (http://jikesrvm.org).
*
* This file is licensed to You under the Eclipse Public License (EPL);
* You may not use this file except in compliance with the License. You
* may obtain a copy of the License at
*
* http://www.opensource.org/licenses/eclipse-1.0.php
*
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership.
*/
class Node2I2A {
int data1;
int data2;
Node2I2A car;
Node2I2A cdr;
static double measuredObjectSize = 0.0;
static int objectSize = 0;
static Object fakeLock = new Object();
// This should require no more than 28 Megs even with 3 word headers
//
public static void computeObjectSize() {
int estimateSize = 1000000;
while (true) {
System.gc();
long start = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
Node2I2A head = new Node2I2A();
Node2I2A cur = head;
for (int i = 0; i < estimateSize; i++) {
cur.cdr = new Node2I2A();
cur = cur.cdr;
}
synchronized (fakeLock) {
// This seemingly useless lock operation prevents the optimizing
// compiler from doing redundant load elimination of the internal fields
// used to compute freeMemory in the watson semispace collector.
// Fairly amusing...at the HIR level there is of course nothing in the above loop
// that would cause the compiler to think that the fields of VM_ContiguousHeap get changed.
// Arguably the fields in question should be marked volatile, but injecting this
// fake lock operation here causes us to obey the java memory model and not do the
// redundant load elimination.
}
long end = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
long used = end - start;
if (used > 0) {
measuredObjectSize = used / ((double) estimateSize);
objectSize = (int) (measuredObjectSize + 0.5); // round to byte
objectSize = (objectSize + 2) / 4 * 4; // round to word
if (objectSize > 16)
break;
}
estimateSize = (int) (0.75 * estimateSize);
System.out.println("GC occured since used memory decreased after allocation or implausible object size obtained. Retrying with " + estimateSize + " objects.");
}
}
public static Node2I2A createTree(int nodes) {
if (nodes == 0) return null;
int children = nodes - 1;
int left = children / 2;
int right = children - left;
Node2I2A self = new Node2I2A();
self.car = createTree(left);
self.cdr = createTree(right);
return self;
}
}