当前位置: 首页 > 面试题库 >

java -Xmx1G是否表示10 ^ 9或2 ^ 30字节?

林鹭洋
2023-03-14
问题内容

而在一般情况,是用于单位-Xmx-Xms-Xmn选项(“K”,“M”和“G”,或不太标准的可能性“K”,“m”或“G”)的二进制前缀倍数(即,功率1024),还是1000的幂?

手册说它们代表千字节(kB),兆字节(MB)和千兆字节(GB),表明它们具有原始SIhtml" target="_blank">系统中定义的1000的幂。我的非正式测试(我不太有信心)表明它们的确是千字节(kiB),兆字节(MiB)和千兆字节(GiB),所有幂都是1024。

那哪个是对的?例如,什么Java代码将显示当前大小?

对于RAM大小,使用1024的倍数并不奇怪,因为RAM通常是通过将硬件模块加倍来物理布局的。但是,随着我们获得越来越大的权力,以清晰,标准的方式使用单位变得越来越重要,因为混乱的可能性越来越大。我的JVM也接受单位“
t”,并且1 TiB比1 TB大10%。

注意:如果这些确实是二进制倍数,我建议更新文档和用户界面,使其非常清楚,例如“ 添加字母k或K表示千字节(1024字节),或m或M表示兆字节(
1048576个字节)
”。这就是采用的方法,例如,在Ubuntu中:UnitsPolicy-Ubuntu
Wiki。


问题答案:

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

长答案:

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

例如,设置大小为8 GB,您可以指定8g8192m8388608k,或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;
  }
}

这些常数KMG定义在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”和其他。噢,上帝保佑我们。)



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

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

  • 问题内容: 如果存在一个以上的实现,哪个/更好的维护? 专门用于OAuth 2.0草案12。 问题答案: 来自OAuth Wiki ,似乎有一个名为oauth2-php的 PHP实现,它支持IETF v9草案。由于OAuth2仍是草案,因此可能很难找到更多实现。

  • 40min AK T1 Problem 给定一个长度为n的字符串,进行q次操作,每次操作修改其中一个字符,每次修改后输出极长连续字符的段数,如aabbaaa的段数是3。 Solution set存连续段的(起点、终点、字符),每次修改字符的时候最多影响三个连续段,修改后输出set的大小即可。 T2 Problem 同一天内吃糖果的愉悦度为a1+max(0,a2-1)+max(0,a3-2)+...

  • 问题内容: 据我了解,Java编译器生成“字节代码”,而不是“目标代码”。首先,这是正确的吗? 而且,这就是我的书所说的,我想知道为什么这是正确的。字节码和目标码有什么区别? 问题答案: 字节代码只是Java虚拟机的“目标代码”。它不是 本机 代码(例如x86)。老实说,这些天我很少听到“目标代码”一词-用更具体的术语讲通常更清晰。

  • 好未来【笔试笔经:9-30】: 选择题(14) 1. 二维数组指定为之前元素个数计算。 2.出入栈顺序问题。 3.不是类的成员函数【友元】。 4.【a,b,c,d】是先序遍历,问可以有几个不同的二叉树。 5.合并两个有序链表的最坏时间复杂度。 6.不是HTTP请求方法是:【get,post,delete,update】? 7.先后序遍历顺序相反的二叉树特征【空/单个结点】? 8.套接字的组合是:【