简短的答案:JVM命令行参数使用的所有内存大小均以传统的二进制单位指定,其中千字节为1024字节,其他以1024为底的幂。
长答案:
在命令行参数的此文档页面上,以下内容适用于所有接受内存大小的参数:
例如,设置大小为8 GB,您可以指定
8g,8192m,8388608k,或8589934592作为参数。
对于
-Xmx,它提供了以下特定示例:
下面的示例演示如何使用各种单位将分配的最大内存大小设置为80 MB:
-Xmx83886080-Xmx81920k-Xmx80m
之前,我想检查文件(我以为你已经有了?),我检查热点的源头,发现内存值在解析SRC /共享/ VM /运行/
arguments.cpp由功能
atomull(这似乎代表“
ASCII到内存,无符号长整长整”):
// Parses a memory size specification string.static bool atomull(const char *s, julong* result) { julong n = 0; int args_read = sscanf(s, JULONG_FORMAT, &n); if (args_read != 1) { return false; } while (*s != ' ' && isdigit(*s)) { s++; } // 4705540: illegal if more characters are found after the first non-digit if (strlen(s) > 1) { return false; } switch (*s) { case 'T': case 't': *result = n * G * K; // Check for overflow. if (*result/((julong)G * K) != n) return false; return true; case 'G': case 'g': *result = n * G; if (*result/G != n) return false; return true; case 'M': case 'm': *result = n * M; if (*result/M != n) return false; return true; case 'K': case 'k': *result = n * K; if (*result/K != n) return false; return true; case ' ': *result = n; return true; default: return false; }}
这些常数
K,
M,
G定义在SRC /共享/ VM /实用程序/
globalDefinitions.hpp:
const size_t K = 1024;const size_t M = K*K;const size_t G = M*K;
所有这些都证实了该文档,只是
T后来添加了对TB 的后缀的支持,并且根本没有记录。
使用单位乘数不是强制性的,因此,如果要 十亿个字节
,可以写入
-Xmx1000000000。如果您确实使用乘法器,则它们是二进制的,因此
-Xmx1G意味着2个30字节或1个RAM。
(这并不十分令人惊讶,因为Java早于IEC追溯重新定义现有单词的尝试。如果IEC仅建议使用限定符“ binary”和“
decimal”来消除存储单元的歧义,那么有时它们的含义就可以避免混乱。不清楚,例如, 二进制千兆字节 (GB 2)= 1024 3字节,
十进制千兆字节 (GB 10)= 1000 3字节,但是不,他们重新定义了每个人都在使用的单词,不可避免地引起混乱,使我们陷入困境这些小丑用语分别是“
gibibyte”,“ tebibyte”和其他。噢,上帝保佑我们。)