如果我有类似以下的代码:
public Constructor(final Object o) {
taskSystem.add(new CycleTask(15, 15, -1) {
@Override
public void execute() throws Throwable {
//access o here every 15 cycles forever
}
});
}
Run Code Online (Sandbox Code Playgroud)
什么时候会被垃圾收集,如果有的话?只有当任务被收集,或者它会永远留在记忆中,因为它是最终的?
我正在尝试使用Java来创建一个启动注册表项,我得到一个非常奇怪的结果.在某些操作系统(如XP)上,命令可以完美运行.但是,在Windows 7上,它只会在运行已编译的jar或类时创建密钥,而不是从网页上的applet运行.此外,在Windows 8上,该命令根本不起作用.我已经尝试过调试它,似乎REG命令正在成功执行.如果我从命令提示符手动运行该命令,它将创建键,其输出与从程序内部运行时的输出相同.下面是代码示例:
public static int regadd(String key, String name, String val) throws IOException, InterruptedException {
ProcessBuilder pb = new ProcessBuilder(new String[]{"REG", "ADD", key, "/v", name, "/d", val, "/f"});
pb.redirectOutput(new File(PathManager.getDirectory(), "log0.txt"));
int i = pb.start().waitFor();
Logger.log("ADD: " + i);
return i;
}
Run Code Online (Sandbox Code Playgroud)
在log0.txt中打印:
操作成功完成.
另外,程序的"结果"打印出来
地址:0
所以在这一点上,我不知道可能是什么问题.我知道添加到注册表的其他有趣的方法,但我想保持我的代码与所有VM分发兼容.有没有办法完成这个或修复现有的方法?
所以我的理解是增强的for循环应该更慢,因为它们必须使用Iterator.但是我的代码提供了混合结果..(是的我知道循环逻辑占用了循环中花费的大部分时间)
对于较少的迭代次数(100-1000),使用和不使用JIT时,增强的for循环似乎要快得多.相反,迭代次数很多(100000000),传统的循环要快得多.这里发生了什么?
public class NewMain {
public static void main(String[] args) {
System.out.println("Warming up");
int warmup = 1000000;
for (int i = 0; i < warmup; i++) {
runForLoop();
}
for (int i = 0; i < warmup; i++) {
runEnhancedFor();
}
System.out.println("Running");
int iterations = 100000000;
long start = System.nanoTime();
for (int i = 0; i < iterations; i++) {
runForLoop();
}
System.out.println((System.nanoTime() - start) / iterations + "nS");
start = System.nanoTime();
for (int i = 0; i < …Run Code Online (Sandbox Code Playgroud)