当前位置: 首页 > 知识库问答 >
问题:

java-xmx1g是指10^9还是2^30字节?

罗飞宇
2023-03-14

注意:有关选项的更多用途,请参见java-启动JVM时的Xms和Xmx参数是什么?。

共有1个答案

束俊材
2023-03-14

简单回答:JVM命令行参数使用的所有内存大小都是以传统的二进制单位指定的,其中千字节是1024字节,其他是1024的幂。

长长的回答:

在命令行参数上的文档页面中,以下内容适用于所有接受内存大小的参数:

// 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后缀的支持显然是后来添加的,而且根本没有文档。

不强制使用单位乘法器,因此如果您想要十亿字节,可以编写-xmx1000000000。如果确实使用乘法器,它们是二进制的,因此-xmx1g表示230字节,或一棒O'RAM。

(这并不奇怪,因为Java早于IEC试图追溯性地重新定义现有单词。如果IEC只是建议在偶尔它们的含义不清楚的时候用限定词“binary”和“decimal”来消除内存单元的歧义,那么混乱本来可以避免。例如,binary gigabytes(GB2)=10243字节,而decimal gigabytes(GB10)=10003字节。但不,他们重新定义了每个人都在使用的单词,不可避免地引起了混乱,让我们只能用“gibibyte”、“tebibyte”和其他的小丑术语。哦,上帝保佑我们。

 类似资料:
  • 问题内容: 而在一般情况,是用于单位,和选项(“K”,“M”和“G”,或不太标准的可能性“K”,“m”或“G”)的二进制前缀倍数(即,功率1024),还是1000的幂? 手册说它们代表千字节(kB),兆字节(MB)和千兆字节(GB),表明它们具有原始SI系统中定义的1000的幂。我的非正式测试(我不太有信心)表明它们的确是千字节(kiB),兆字节(MiB)和千兆字节(GiB),所有幂都是1024。

  • C 中的 Integer 变量是占用 2 个字节还是 4 个字节?它所依赖的因素是什么? 大部分教材都说整型变量占用2个字节。但是当我运行一个程序,打印一个整数数组的连续地址时,它显示了4的差异。

  • 问题内容: 为什么 初始空间 大于“ 10”的“ 2”? 我在latin1和utf8英语归类中都尝试过: 我知道它与类型有关,因为当它被强制转换时,它可以按预期工作: 这里到底发生了什么? 编辑: 以上所有操作都是在Fedora 13中使用8.4.8完成的。但是我只是在Centos 6中使用9.04进行了测试,结果相同: 数据库清单 新编辑: 这是为了进一步混淆: 问题答案: 我认为Postgre

  • 问题内容: 对于长数据类型,我可以在L后面加上数字以使编译器知道它长。字节和短怎么样? 作为动机,以下产生类型不匹配错误: 问题答案: 您实际上在谈论的是整数 文字 ()与长 文字 ()。实际上,在Java中没有短或字节字面量。但它 通常 并不重要,因为从整数常量的类型的隐式转换,和。从而: 仅当文字在所需范围内时,才允许隐式转换。如果不是,则需要类型转换。例如 在其他情况下,需要显式转换;例如,

  • 我的问题是,在这段代码中,最初我们将boolean isAnagram设为false,然后设置条件,但是我们得到的结果是错误的。因为很清楚,它们不是anagram,但是代码输出是“anagram”。

  • 问题内容: 我有一个客户端服务器程序在服务器端使用套接字,并且读写发生在这种方式 同样在cilent(android)方面… 问题是,建立连接后,程序会卡住它们,没有错误,也没有异常。停下来 问题答案: 这是一个死锁,您必须首先创建并刷新ObjectOutputStream。这是因为ObjectInputStream在继续操作之前先读取OOS发送的标头。