【问题标题】:JVM memory managementJVM内存管理
【发布时间】:2015-05-24 22:11:00
【问题描述】:

在我的 MPI 程序中遇到 JVM 内存分配崩溃后,我试图了解内存管理的工作原理。为了做到这一点,我添加了如下所示的线条。

public static void main(String[] args) throws MPIException {
    System.out.println("memory upon initialisation: " + (Runtime.getRuntime().totalMemory() >> 20) + "MB");
    //run some with some loops and a lot of variables...
    System.out.println("memory when finished: " + (Runtime.getRuntime().totalMemory() >> 20) + "MB");
}

我运行了这段代码,可以看到堆大小是如何增加的,但是当我在代码中添加 System.gc(); 行时,堆大小不再扩大。

因此,我的问题是:为什么 JVM 似乎更喜欢扩展堆而不是进行一些垃圾收集?我希望 JVM 在进一步分配内存之前先尝试垃圾收集。

提前致谢

【问题讨论】:

标签: java memory garbage-collection jvm


【解决方案1】:

JVM 假定您可以通过 -Xmx 分配尽可能多的堆。更多的堆空间意味着更高的 GC 吞吐量和更少的 GC 暂停频率。由您决定愿意投资多少 RAM 来帮助您的 JVM 运行良好。至少这是默认推理;您可能会通过大量可配置选项影响 JVM 的选择。

【讨论】:

  • 为什么他们决定吞吐量应该比内存占用更重要?垃圾回收不是比内存分配“便宜”吗?
  • 内存分配非常便宜,而且大多数时候只是增加一个线程本地指针,指示下一个空闲位置。 GC 更加精细,对缓存不太友好。与更小、更频繁的 GC 相比,一次性执行更多 GC 可提供更好的吞吐量。