小编典典
简短的答案: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 != '\0' && 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 '\0':
*result = n;
return true;
default:
return false;
}
}
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”和其他。噢,上帝保佑我们。)
2020-11-16