【问题标题】:Memory size feasible via Virtual Memory vs RAM通过虚拟内存与 RAM 可行的内存大小
【发布时间】:2020-09-01 11:17:41
【问题描述】:

我正在尝试实例化一个巨大的ArrayList

List<Integer> list = new ArrayList<Integer>(Integer.MAX_VALUE);  

在eclipse中运行它我得到:

java.lang.OutOfMemoryError: Requested array size exceeds VM limit  

如果我这样做:

List<Integer> list = new ArrayList<Integer>(Integer.MAX_VALUE - 2);  

我得到一个不同的错误:

Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory failed; error='The paging file is too small for this operation to complete'   

#
# there is insifficent memory for the Java Runtime Environment to continue.   

我在 Eclipse 的运行配置中使用以下设置启动程序:
-Xmx8G

那么这里的问题是什么?即使我增加到-Xmx16G 它仍然给出同样的错误

更新
我有点困惑,RAM的实际大小在这里重要吗?由于分页,进程不能访问无限的虚拟内存吗?

【问题讨论】:

  • 您的计算机上有 16 GB 的 RAM 吗?
  • @Abra:不,只有 6GB。但这有关系吗?操作系统不做虚拟内存交换吗?
  • @Abra: Can the operating system assign all its RAM to your java process 我该如何检查?我不知道
  • @Abra:我得到Invalid initial heap size: -Xms=4G
  • 你并不真的需要这么大的数组,对吧?

标签: java operating-system hardware virtual-memory java-heap


【解决方案1】:

我有点困惑,这里 RAM 的实际大小重要吗?

是的,确实如此。

由于分页,进程不能访问无限的虚拟内存吗?

是的,他们确实...以您需要磁盘空间来保存虚拟内存页面为模。确实,就是您收到此错误的原因:

The paging file is too small for this operation to complete.

这个“修复”是使页面文件更大。这必须在操作系统级别完成。

然而,分页意味着操作系统必须在需要时将页面从磁盘复制到内存。为了给它们腾出空间,它必须将其他(脏)页面从 RAM 复制到磁盘。所有这些复制都会占用 CPU 和磁盘 I/O 带宽并减慢您的程序。

一个典型的(C / C++)程序通常可以在一定程度上解决这个问题,这取决于应用程序的内存访问模式。但是在 Java 中,您会遇到 GC 偶尔运行的问题。在一段时间内,GC 将以(基本上)随机顺序访问大量页面中的对象。对于“完整”的垃圾回收来说,情况更糟。

如果应用程序正在访问的页面集(即“工作集”)的大小大于可用 RAM 页面的数量,则可能会出现“抖动”;即通过页面的读取和写入使 I/O 系统饱和。这对性能来说真的很糟糕。在极端情况下,它会使操作系统无响应。

因此,使用大于可用物理 RAM 的堆运行 Java 应用程序是一件有潜在危险的事情。

【讨论】:

  • 感谢您的澄清。所以基本上虽然根据教科书我们的程序可以考虑访问无限的虚拟地址空间,但实际上即使是一小部分需要比系统更多的 RAM 也会导致性能不佳,而且会导致意想不到的后果?考虑到相对安全的实际 RAM 是否有一些限制?
  • “所以基本上虽然根据教科书......”。你说的是哪本教材?我清楚地记得我关于操作系统原理的本科教科书警告关于抖动问题。 (那是 30 多年前的事了……)
  • 没有。没有这样的限制。这取决于应用程序的行为;即它的内存访问模式。 (事实上​​......其他程序正在做什么!)还有操作系统和硬件以所需速率传输页面的能力。
  • 是的,他们确实警告过垃圾,我知道性能会过于成问题。但是(对我来说)并不清楚 a) 必须对操作系统配置进行调整才能使程序能够尝试通过物理 RAM。
  • 那么对于需要大量内存进行计算的程序来说,什么是好的做法呢?根据不同的设备发布不同的版本?专注于设备子集?
猜你喜欢
  • 1970-01-01
  • 2011-03-25
  • 2016-09-12
  • 2018-07-27
  • 1970-01-01
  • 2016-09-26
  • 2013-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多