>>
>> Any patch with lazy evaluation will not cause problems in the "normal"
>> case but will affect debugging Fred because turning on debug log level
>> for a single class will cause all lazy parameters everywhere to be
>> created.
Before someone calls me out on this one I this is how you can use lazy
evaluation without garbage on hotspot jvms. The statement becomes
getLog().log( <lazy args> ) and the predicate goes in the getter.
===== CallSiteJitting.java =====
public class CallSiteJitting {
static interface Logger {
void log(Object ar1, Object ar2);
}
static class MuteLogger implements Logger {
public void log(Object ar1, Object ar2){}
}
static class RealLogger implements Logger {
static long sideEffect;
public void log(Object ar1, Object ar2) {
sideEffect += ar1.hashCode();
sideEffect += ar2.hashCode();
}
}
private static final Logger mute = new MuteLogger();
private static final Logger real = new RealLogger();
private static boolean once;
private static Logger getLog() {
if (!once) {
once = true;
System.out.println("real logging once");
// if you return real every time lots of
// garbage collections happen
return real;
}
return mute;
}
public static void main(String []ar) throws Exception {
for (long l = 0; l < Long.MAX_VALUE; l++) {
getLog().log(new Object(), new Object());
}
System.out.println(RealLogger.sideEffect);
}
}
===== end CallSiteJitting.java