简短回答:JVM 命令行参数使用的所有内存大小都以传统的二进制单位指定,其中 1 千字节为 1024 字节,其他的则以 1024 的幂递增。
长答案:
命令行参数上的此文档页面指出,以下内容适用于所有接受内存大小的参数:
例如,若要将大小设置为 8 GB,可以指定 、 、 或 作为参数。8g
8192m
8388608k
8589934592
对于 ,它给出了这些具体的例子:-Xmx
以下示例显示如何使用各种单位将分配内存的最大允许大小设置为 80 MB:
-Xmx83886080
-Xmx81920k
-Xmx80m
在我想检查文档之前(我假设你已经有了?),我检查了HotSpot的源代码,发现内存值在src / share / vm / runtime /arguments中解析.cpp由函数解析(这似乎代表“ASCII到内存,无符号长长”):atomull
// 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;
}
}
这些常量 , 在 src/share/vm/utilities/globalDefinitions.hpp 中定义:K
M
G
const size_t K = 1024;
const size_t M = K*K;
const size_t G = M*K;
所有这些都证实了文档,除了对TB后缀的支持显然是后来添加的,并且根本没有记录。T
使用单位乘法器不是强制性的,因此,如果您想要十亿字节,则可以编写 。如果您确实使用乘法器,则它们是二进制的,因此意味着230字节,或一个内存。-Xmx1000000000
-Xmx1G
(这并不奇怪,因为Java早于IEC试图追溯性地重新定义现有单词。如果IEC只是建议在偶尔的含义不清楚的情况下用限定词“二进制”和“十进制”来消除存储单元的歧义,则可以节省混淆。例如,二进制千兆字节 (GB2) = 10243 字节,十进制千兆字节 (GB10) = 10003 字节。但是不,他们重新定义了每个人都已经在使用的词,不可避免地爆发了混乱,让我们陷入了这些小丑术语“gibibyte”,“tebibyte”和其他术语中。哦,上帝保佑我们。