【问题标题】:out-of-memory error -- why not paging?内存不足错误——为什么不分页?
【发布时间】:2014-07-18 14:29:53
【问题描述】:

在java程序中经常出现Out-of-memory错误。我的问题很简单:当超过内存限制时,为什么 java 直接杀死程序而不是将其交换到磁盘?我认为现代操作系统中经常使用内存分页/交换策略,而像 c++ 这样的编程语言肯定支持交换。谢谢。

【问题讨论】:

  • 因为 JVM 不会超过你为它分配的内存。这就是 -Xmx 参数的用途(默认值是 1G 或总内存的 1/4)。
  • “C++ 绝对支持交换”。我很想看看这样的例子。
  • @Gimby 我想我找到了这个函数:man7.org/linux/man-pages/man2/mmap.2.html 它可以让你映射一个文件,这是类似的。
  • 内存映射确实是主要操作系统(甚至Windows)提供的一种技术。不是 C/C++。

标签: java out-of-memory paging


【解决方案1】:

@Pimgd 有点走上正轨:但@Kayaman 是对的。 Java 除了从系统请求内存外,不处理内存。 C++ 不支持交换,它向操作系统请求内存,而操作系统将进行交换。如果您使用-Xmx 为您的应用程序请求足够的内存,它可能会开始交换,因为操作系统认为它可以。

【讨论】:

  • 进一步观察,C 可能会支持交换。不太确定。
  • 但是java为什么要麻烦用户设置内存限制呢?在大多数情况下,用户希望他们的程序能够顺利运行而不会出现任何中断。作为用户,我总是希望将 -Xmx 设置为一个非常大的数字,以保证不会发生内存不足错误。如果系统支持交换,那为什么不依赖操作系统呢?
  • 因为Java运行的是虚拟机。这就是为什么它被称为 Java 虚拟机或 JVM。这是一个设计选择,可能是为了支持它(JVM)所做的运行时优化。
【解决方案2】:

因为 Java 是跨平台的。可能没有磁盘。

其他原因可能是这样的事情会影响性能,而开发人员不希望这种情况发生(因为 Java 已经承担了性能开销?)。

【讨论】:

  • Java 会带来初始性能开销,但 JVM 可以在运行时进行优化,使其性能优于 C/C++。见stackoverflow.com/questions/538056/…
  • 我知道 Java 可以非常快,但我不想成为必须编写垃圾收集器的人,它还必须处理磁盘上的分页内存(同时不影响应用程序性能,当然)......他们(java开发人员)很久以前就做出了这个决定......
  • Java 使用 GC 进行分页;它很慢。 publib.boulder.ibm.com/infocenter/javasdk/tools/…
  • 我知道如果我在这个问题上停留的时间足够长,我会学到一些东西=D
【解决方案3】:

关于分页的几句话。使用分页的虚拟内存——存储系统上运行的任何程序的 4K(或类似)块——是操作系统可以或不能做的事情。仅受用于存储地址的机器字容量限制的地址空间的承诺听起来很棒,但有一个严重的缺点,称为thrashing。当页面(重新)加载的数量超过某个频率时会发生这种情况,这反过来是由于太多进程请求太多内存以及这些进程的内存访问的非本地性。 (如果一个进程可以在只访问一小部分页面的同时执行很长一段代码,那么它就具有良好的局部性。)

分页还需要(快速)辅助存储。

限制程序内存资源的能力(如在 Java 中)不仅是一种负担;当需要为服务器系统设计资源使用的总体计划时,它也必须被视为一种祝福。

【讨论】:

    猜你喜欢
    • 2011-10-12
    • 1970-01-01
    • 2011-01-11
    • 2012-04-14
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-20
    相关资源
    最近更新 更多