这是我正在尝试的小代码.该程序需要很长时间才能执行.在运行时,如果我试图通过eclipse中的终止按钮杀死它,它会返回Terminate Failed.我可以从终端使用它杀死它kill -9 <PID>.
但是,当我不在程序的最后一行打印变量结果时(请检查代码的注释部分),程序立即退出.
我想知道 :
为什么在打印结果值时需要花时间执行?
请注意,如果我不打印value,相同的循环会立即结束.
为什么eclipse无法杀死程序?
更新1: 似乎JVM在运行时(不是在编译时)优化代码.这个帖子很有帮助.
更新2:当我打印值时value,jstack <PID>不起作用.只有jstack -F <PID>工作.任何可能的原因?
public class TestClient {
private static void loop() {
long value =0;
for (int j = 0; j < 50000; j++) {
for (int i = 0; i < 100000000; i++) {
value += 1;
}
}
//When the value is being printed, the program
//is taking time to …Run Code Online (Sandbox Code Playgroud) 我在学校被告知,修改一个索引变量是一个不好的做法for loop:
示例:
for(int i = 0 ; i < limit ; i++){
if(something){
i+=2; //bad
}
if(something){
limit+=2; //bad
}
}
Run Code Online (Sandbox Code Playgroud)
参数是一些编译器优化可以优化循环,而不是重新计算索引并在每个循环中绑定.
我已经进行了一些测试,java似乎默认索引和绑定每次都会重新计算.
我想知道是否有可能激活这种功能JVM HotSpot?
例如,优化这种循环:
for(int i = 0 ; i < foo.getLength() ; i++){ }
Run Code Online (Sandbox Code Playgroud)
无需写:
int length = foo.getLength()
for(int i = 0 ; i < length ; i++){ }
Run Code Online (Sandbox Code Playgroud)
这只是一个例子,我很想尝试看到改进.
编辑
根据Peter Lawrey的回答,为什么在这个简单的例子中JVM没有内联getLenght()方法?:
public static void main(String[] args) {
Too t = new …Run Code Online (Sandbox Code Playgroud) 此代码按预期打印"平均运行次数:0.99864197"
import java.util.Random;
public class A {
public static void main(String[] args) {
int min = -30;
int max = 1;
test(min, max);
}
static void test(int min, int max){
int count = 0;
Random rand = new Random(0);
for(int j = 0; j < 2097152; j++){
int number = min + rand.nextInt(max-min+1);
for(int i = 0; i < number; ++i) {
System.out.print("");
count++;
}
}
System.out.println("Average Number of Runs: " + count/65536F);
}
}
Run Code Online (Sandbox Code Playgroud)
此代码应打印相同的确切数字,但它会打印一个随机的负数.
import java.util.Random;
public class …Run Code Online (Sandbox Code Playgroud)