相关疑难解决方法(0)

为什么这个程序在循环后有一个`println`时循环很多次?

这是我正在尝试的小代码.该程序需要很长时间才能执行.在运行时,如果我试图通过eclipse中的终止按钮杀死它,它会返回Terminate Failed.我可以从终端使用它杀死它kill -9 <PID>.

但是,当我不在程序的最后一行打印变量结果时(请检查代码的注释部分),程序立即退出.

我想知道 :

  1. 为什么在打印结果值时需要花时间执行?
    请注意,如果我不打印value,相同的循环会立即结束.

  2. 为什么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)

java eclipse loops println

26
推荐指数
3
解决办法
2028
查看次数

用于优化循环语句的JVM选项

我在学校被告知,修改一个索引变量是一个不好的做法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)

java optimization jvm loops

7
推荐指数
2
解决办法
3685
查看次数

近空的Java For-Loop行为很奇怪

此代码按预期打印"平均运行次数: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)

java debugging jvm loops nested-loops

5
推荐指数
1
解决办法
234
查看次数

标签 统计

java ×3

loops ×3

jvm ×2

debugging ×1

eclipse ×1

nested-loops ×1

optimization ×1

println ×1