java - 通过虚拟内存与 RAM 实现的内存大小

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

我正在尝试实例化一个巨大的 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 的实际大小在这里重要吗?由于分页,进程是否可以访问无限的虚拟内存?

最佳答案

I am bit confused, does the actual size of RAM matter here?


是的,它确实。

Don't processes have access to unlimited virtual memory thanks to paging?


是的,他们确实......取模您需要磁盘空间来保存虚拟内存页面。确实,这就是您收到此错误的原因:
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 应用程序是一件有潜在危险的事情。

关于java - 通过虚拟内存与 RAM 实现的内存大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61822481/

相关文章:

java - 谁能告诉我为什么 eclipse 不喜欢这个 java 数组初始化?

java - Spring,Hibernate,Blob 延迟加载

process - 内核栈有什么用?

c - while 查看 switch 语句的内部(双重中断)

java - 将多个字符串的不同子字符串添加到 Treeset

java - 通过tomcat运行unix命令

operating-system - STARTUP IPI 对应用程序处理器有什么影响?

graphics - CPU 什么时候在 GPU 上等待?

hardware - 好(便宜?)显卡,可以在办公室使用这些额外的显示器

android - 开发人员友好的 OBD-II 端口汽车诊断工具?