我正在运行一个非常小的程序,我模拟玩彩票。我注意到在我的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);
}
答案 0 :(得分:1)
很多内存都是虚拟的。 Java倾向于过度配置并占用比有时需要更多的内存,但该内存实际上并未实际映射,直到使用。您应该能够检查物理内存和虚拟内存使用情况,以查看差异。
如果你看到的是物理用途,那么只需尝试在你的应用程序中分配更少的东西,或者让不再需要的东西快速退出范围。