Re: how many objects r eligible for garbage Collection ?
Roger Lindsj? wrote:
Mark Thornton wrote:
Roger Lindsj? wrote:
The Card object references by c2 might be available too, depending on
what "// do stuff" does with it. Many (all?) GC implementations seem
to not collect objects referenced by variables still on the stack,
but I don't think they are forced to.
Java 6 does collect objects where the only references have no further
use. It is possible to observe this behaviour if you also have a weak
reference to the 'garbage'.
I did not know that it was implemented for Java 6. Will write a sscce to
show this.
I did not manage to observe this, perhaps my program is flawed. I'm
running on:
java version "1.6.0_04"
Java(TM) SE Runtime Environment (build 1.6.0_04-b12)
Java HotSpot(TM) Server VM (build 10.0-b19, mixed mode)
<sscce>
import java.util.WeakHashMap;
public class GcExample {
private WeakHashMap<Object, Object> map =
new WeakHashMap<Object, Object>();
public static void main(String... args) throws Exception {
GcExample g = new GcExample();
g.add(false, false, false);
g.add(false, false, true);
g.add(false, true, false);
g.add(false, true, true);
g.add(true, false, false);
g.add(true, false, true);
g.add(true, true, false);
g.add(true, true, true);
}
public void add(boolean nullify, boolean gc, boolean sleep)
throws Exception {
int garbageLoops = 0;
try {
Object key = new Object();
map.put(key, new byte[20000]);
if (nullify) {
key = null;
}
if (gc) {
System.gc();
}
if (sleep) {
Thread.sleep(100);
}
// Generate garbage
while (map.size() > 0) {
byte[] b = new byte[1000000 * (garbageLoops + 1)];
garbageLoops++;
}
} catch (OutOfMemoryError e) {
} finally {
System.out.format(
"Pass:%-5b Nullify:%-5b GC:%-5b Sleep:%-5b GC factor:%d%n",
map.size() == 0, nullify, gc, sleep, garbageLoops);
map.clear();
}
}
}
</sscce>
java -Xmx32m -Xms32m GcExample
Pass:false Nullify:false GC:false Sleep:false GC factor:29
Pass:false Nullify:false GC:false Sleep:true GC factor:29
Pass:false Nullify:false GC:true Sleep:false GC factor:29
Pass:false Nullify:false GC:true Sleep:true GC factor:29
Pass:true Nullify:true GC:false Sleep:false GC factor:8
Pass:true Nullify:true GC:false Sleep:true GC factor:7
Pass:true Nullify:true GC:true Sleep:false GC factor:1
Pass:true Nullify:true GC:true Sleep:true GC factor:0
taskset -c 0 java -Xmx32m -Xms32m GcExample
Pass:false Nullify:false GC:false Sleep:false GC factor:29
Pass:false Nullify:false GC:false Sleep:true GC factor:29
Pass:false Nullify:false GC:true Sleep:false GC factor:29
Pass:false Nullify:false GC:true Sleep:true GC factor:29
Pass:true Nullify:true GC:false Sleep:false GC factor:8
Pass:true Nullify:true GC:false Sleep:true GC factor:7
Pass:true Nullify:true GC:true Sleep:false GC factor:0
Pass:true Nullify:true GC:true Sleep:true GC factor:0