繁体   English   中英

Java数学(运行时内存百分比)

[英]Java Maths (Runtime Memory Percentage)

我确定我在这里犯了一些非常愚蠢的错误。 我有以下代码:

private static String generateRAM()
{
    final long RAM_TOTAL = Runtime.getRuntime().totalMemory();
    final long RAM_FREE = Runtime.getRuntime().freeMemory();
    final long RAM_USED = RAM_TOTAL - RAM_FREE;
    final long RAM_TOTAL_MB = RAM_TOTAL / 8 / 1024;
    final long RAM_FREE_MB = RAM_FREE / 8 / 1024;
    final long RAM_USED_MB = RAM_USED / 8 / 1024;
    final double RAM_USED_PERCENTAGE = (RAM_USED / RAM_TOTAL) * 100;
    return RAM_TOTAL_MB + "MB TOTAL / " + RAM_FREE_MB + "MB FREE / " + RAM_USED_MB + "MB USED (" + RAM_USED_PERCENTAGE + "%)"; 
}

返回:

15440MB TOTAL / 11809MB FREE / 3630MB USED (0.0%)

该百分比显然是不正确的。 这是怎么发生的? 据我所知,我正在正确地进行所有数学运算。 如果我将给定的数字打入计算器并自己找到百分比,我将得到23.5,这是我的预期结果。

我敢肯定,我犯了一个可怕的错误,我会自欺欺人,有人能启发我吗?

final double RAM_USED_PERCENTAGE = (RAM_USED / RAM_TOTAL) * 100;

这是因为整数除法。 将其中一种类型转换为双精度。

例:

final double RAM_USED_PERCENTAGE = ((double)RAM_USED / RAM_TOTAL) * 100;

根据JLS 15.17.2。 部门负责人/

整数除法朝着0取整。也就是说,在二进制数值提升(第5.6.2节)之后为操作数n和d产生的商是整数值q,其大小应尽可能大,同时满足| d·q | ≤| n |。 此外,当| n |时q为正。 ≥| d | 和n和d具有相同的符号,但是| n |时q为负。 ≥| d | n和d具有相反的符号。

有一种特殊情况不满足此规则:如果被除数是该类型最大可能的负整数,并且除数为-1,则发生整数溢出并且结果等于被除数。 尽管有溢出,在这种情况下也不会引发异常。 另一方面,如果整数除数中的除数的值为0,则抛出ArithmeticException。

更改此行

final double RAM_USED_PERCENTAGE = (RAM_USED / RAM_TOTAL) * 100;

final double RAM_USED_PERCENTAGE = ((RAM_USED * 1.0) / RAM_TOTAL) * 100;

这是因为Java将结果解释为long / long除法,因此结果将是long值,即5/10 =>0。通过将任何操作数的系数double 1.0,编译器将执行double / long操作,将导致值double

您有2个错误。 freeMemory()totalMemory()返回一定数量的字节,因此要将其转换为MB,必须先将其除以1024(kB和MB),再除以8。然后,必须将RAM_USED转换为double,以便将其计算为浮点运算:

private static String generateRAM()
{
    final long RAM_TOTAL = Runtime.getRuntime().totalMemory();
    final long RAM_FREE = Runtime.getRuntime().freeMemory();
    final long RAM_USED = RAM_TOTAL - RAM_FREE;
    final long RAM_TOTAL_MB = RAM_TOTAL / 1024 / 1024;
    final long RAM_FREE_MB = RAM_FREE  / 1024 / 1024;
    final long RAM_USED_MB = (double) RAM_USED / 1024 / 1024;
    final double RAM_USED_PERCENTAGE = ((double) RAM_USED / RAM_TOTAL) * 100;
    return RAM_TOTAL_MB + "MB TOTAL / " + RAM_FREE_MB + "MB FREE / " + RAM_USED_MB + "MB USED (" + RAM_USED_PERCENTAGE + "%)";
}

返回:

10MB TOTAL / 9MB FREE / 0MB USED (2.47130735892926%)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM