【问题标题】:How does Java reserve/use memory?Java如何保留/使用内存?
【发布时间】: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/…(它使用的不仅仅是堆,不要给它一个接近实际可用内存大小的最大堆)

标签: java macos jvm


【解决方案1】:

通常,JVM 会分配新内存,直到堆满为止,在这种情况下,它会进行垃圾收集,释放未引用的对象。如果你为堆分配了 14GB,它很可能会消耗那么多内存。

【讨论】:

    【解决方案2】:

    还有另一个 JVM 参数 -Xms<size> 它的初始堆大小。如果我们没有明确设置它,JVM 将根据 PC 配置自动选择一个。这个值永远不会那么大,通常是 64M。以后 JVM 可能会分配更多的内存,直到最大值。但它只有在应用程序真正使用它时才会发生。如果实际内存使用量减少,JVM 会将内存缩小到更小的大小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-28
      相关资源
      最近更新 更多