为什么我得到堆outOfMemory异常?

Shm*_*opy 6 java heap jvm

我正在尝试分配一个大矩阵(大约10GB).我正在使用64位JVM的64位机器.然后我的进程应该有2^64可用的字节,并且我将JVM堆大小设置为128G(如果重要的话,我的机器中有16GB的RAM).我的理解是我应该从操作系统获取内存,操作系统会将不需要的矩阵单元换出.但是我得到了上述异常.

编辑:

这就是我定义矩阵的方式:

Jama.Matrix A = new Matrix(num_words, num_documents);
Run Code Online (Sandbox Code Playgroud)

哪里num_words是大约100k并且num_documents是大约35k.另外值得一提的是这种类型double

EDIT2:

相关标志:

-Xms40m
-Xmx128g
-d64
Run Code Online (Sandbox Code Playgroud)

ven*_*iac 2

JVM 作为本机进程工作,在这方面:JVM 向操作系统请求内存,操作系统可以在 RAM 或交换区中分配内存。

您可以在 java 中分配的内存并不取决于您的 RAM,而是取决于-Xmx您在运行 JVM 时指定的命令行选项。如果 RAM 中没有足够的内存,JVM 会从交换区接收它,并且(我相信)甚至不知道这一点。

然而,

  • 在某些操作系统(Windows XP)中,限制为 4G。
  • JVM 中的堆并非设计为脱离磁盘运行。
  • 交换空间有限。

如果您需要处理大数据,则需要使用 BigMemory 产品(EhCache 或 Terracotta)。

最后,运行 jvisualvm 或使用-verbose:gc参数来查看堆分配。