如何在Java中更优化地运行一个非常小的程序

时间:2015-02-18 23:55:04

标签: java windows algorithm jvm java-7

我正在运行一个非常小的程序,我模拟玩彩票。我注意到在我的Windows任务管理器中,它占用了超过100MB的RAM,即使我知道我只使用了一些内存块。

我相信JVM默认使用一些128MB默认值的RAM。它让我思考 - 有没有办法强制JVM绕过RAM并在缓存,堆或更快的内存区域中运行?

如果我们没有那个级别的控制,那么什么JVM参数允许一个需要比内存更快的程序呢?

import org.apache.commons.lang3.time.StopWatch;

static final PrintStream err = System.err;
static final PrintStream out = System.out;

private static void studyOdds() {
    List<Integer> list1 = new ArrayList<>();
    for (int i = 1; i <= 75; i++)
        list1.add(new Integer(i));

    List<Integer> list2 = new ArrayList<>();
    for (int i = 1; i <= 15; i++)
        list2.add(new Integer(i));

    ArrayList<Integer> winner = null;

    Deque<Long> winIndx = new LinkedList<>();
    StopWatch sw = new StopWatch(), sw2 = new StopWatch(), sw3 = new StopWatch();
    sw.start();
    sw2.start();
    sw3.start();
    for (long i = 0; i <= 1000000000L; i++) {
        Collections.shuffle(list1);
        Collections.shuffle(list2);
        ArrayList<Integer> pick = new ArrayList<>(6);
        for (int j = 0; j < 5; j++)
            pick.add(list1.get(j));
        Collections.sort(pick);
        pick.add(list2.get(0));

        if (winner == null) {
            winner = (ArrayList<Integer>) pick.clone();
            out.println("Winning #s are: " + winner);
            winIndx.addLast(0L);
        } else if (winner.equals(pick)) {
            err.format(
                    "Found it!%n%s%nWinner count = %d/%s%nPicks since last = %s%nTotal time to find = %s%n",
                    pick, winIndx.size(), fi(i),
                    fi(i - winIndx.peekLast()), sw2);
            winIndx.addLast(i);
            sw2.reset();
            sw2.start();
        }
        if (i % 100000000L == 0 && i > 0) {
            out.format("i = %s%ntime = %s%ntime since last = %s%n", fi(i),
                    sw, sw3);
            sw3.reset();
            sw3.start();
        }
    }
    System.out.println("Total time: " + sw);
}

static final String fi(final long i) {
    return NumberFormat.getIntegerInstance().format(i);
}

1 个答案:

答案 0 :(得分:1)

很多内存都是虚拟的。 Java倾向于过度配置并占用比有时需要更多的内存,但该内存实际上并未实际映射,直到使用。您应该能够检查物理内存和虚拟内存使用情况,以查看差异。

如果你看到的是物理用途,那么只需尝试在你的应用程序中分配更少的东西,或者让不再需要的东西快速退出范围。