【发布时间】:2014-01-28 01:53:49
【问题描述】:
这可能是一个菜鸟问题,但我需要运行一个处理大型数据集的 java 应用程序。所以我去 -Xmx14G,知道我的机器有 16G 的物理内存。
不久之后,砰,我的操作系统通知我我的启动磁盘快满了。我检查了我的进程,没有OOM异常,只是它停滞了。检查了我的活动监视器,并没有说应用程序以满内存容量运行。
JVM如何保留/使用内存?
【问题讨论】:
-
其他所有东西都占用了多少内存?
-
当您在大多数现代操作系统上使用存储时,系统会在磁盘上为存储分配“交换空间”,以便在必要时可以“分页”该存储并“分页”另一个进程。具体如何做到这一点取决于操作系统——我认为 Windows 会分配一个单独的交换区域,但 Linux 可能会为每个进程分配一个空间。
-
听起来 OS X 急切地确保内存容量/支持交换。 OTOH,Linux 相当愿意overcommit:“过度使用是指在不保证物理存储存在的情况下提供虚拟内存的做法”(但 Linux 不是 OS X,当然,我找不到任何建议OS X 允许这样的过度使用)。
-
不确定您是否正在使用一些 IDE 开发此应用程序并对其进行大量调试。然后一段时间后清理项目不会有什么坏处。只是猜测。
-
相关:stackoverflow.com/questions/8037920/…(它使用的不仅仅是堆,不要给它一个接近实际可用内存大小的最大堆)