2013-12-09 104 views
-1

我有一台内存为10GB的机器。我正在运行6个java进程,并将-Xmx选项设置为2GB。所有6个进程同时运行并消耗整个2GB内存的概率非常低。但我仍然想了解这种最坏的情况。超过运行java进程的服务器的最大内存

当所有6个进程在同一时刻消耗少于2GB的内存时会发生什么情况,以至于JVM并未启动垃圾回收,但进程拥有的内存很多,并且这6个进程消耗的内存总和超过可用的RAM?

这会使服务器崩溃吗?

会减慢处理速度吗?

回答

1

您的机器将开始交换。只要每个java进程只使用它分配的一小部分内存,就不会注意到这种效果,但如果它们全部都是同时进行垃圾回收,访问所有内存,则您的硬盘将拥有100%利用率和机器将“感觉”非常非常缓慢。

+0

最重要的是,如果一个进程峰值,并且进行了2GB内存,JVM将不会返回任何内存回操作系统,即使处理返回到使用RAM的200MB从比时刻起。这意味着,长期居住的应用程序每个使用2GB可能会发生相当大的变化。 – Augusto

+1

@Augusto这并不是说在JVM不能返回内存的操作系统,但在我的经验,当你可能期望它绝少。 –

2

您应该期待每个JVM可以使用多于2 GB的内存。这是因为堆仅仅是一个存储区,你也有

  • 共享库
  • 线程堆栈
  • 直接存储器
  • 本机内存的共享库
  • 烫发根使用。

这意味着设置2 GB的最大堆并不意味着您的进程最大2 GB。

您的进程应该运行良好,直到他们获得了交换堆并执行GC的点。 GC假定随机访问整个堆,此时,系统可能会像疯了一样开始交换。如果你有一个用于交换的SSD,你的系统可能会停止,或者几乎停止很长一段时间。如果您有Windows(这是我所发现的是比Linux在这方面更差)和HDD,你可能不会拿到机器的控制权交还给并有电源后再重新打开。

我会建议减少堆最多说1.5 GB,或购买更多的内存。您可以获得约8美元的大约100美元。

+0

我欠你一杯啤酒,我不知道JVM返回了内存。这里有一个解释:http://stackoverflow.com/questions/675589/jvm-sending-back-memory-to-os – Augusto

相关问题