0

操作系统运行 10 个虚拟机 JVM。事实上,大多数人什么都不做——有时只是做一份工作。每个进程分配 600MB 的系统内存。我知道实际上最多可以使用 100 MB。每个进程的剩余 500 MB 是由 JVM(OldGen 等)管理的内存。不幸的是,我的系统只有 2GB 的 RAM,因此大部分内存分配到了交换区。这意味着当时间到了其中一台机器——第一台机器上,swap 会被读取到系统内存数十秒。

有没有什么办法可以强制JVM在完成任务后向操作系统释放内存?例如,GC 将每 1-5 分钟运行一次,因此进程内存已被释放给系统。

我正在使用:Linux x86_64 SMP、Java HotSpot (TM) 64-Bit Server VM 1.6.0

4

2 回答 2

0

这意味着当时间到了其中一台机器——第一台机器上,swap 会被读取到系统内存数十秒。

内存页面仅在被访问时才被交换。如果您所说的 500MB 从 JVM 的角度来看真的是“免费的”,那么它们最终不会被换入。JVM 接触该内存一定是有原因的。一种可能性是它不是真正免费的,而是包含活动对象。

我会推荐:

  1. 使用内存分析器(YourKit 或 VisualVM)查看 JVM 的实际内存使用情况。
  2. 可能使用-Xmx.
于 2012-04-26T13:44:14.100 回答
0

我不是性能问题方面的专家,但让我尝试帮助您解决这个问题。

有一个对垃圾收集系统的调用是 System.gc()。如果您查阅 System 类的官方文档(http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/System.html),它会告诉您此方法运行垃圾收集.

不过,如果您查阅 Internet(例如System.gc() 何时执行任何操作),您会看到此调用可能会调用垃圾收集系统。我的个人经历与那篇文章一致。

由于内存管理是自动化的,垃圾收集系统将竭尽全力为您做好内存管理工作。管理算法非常有效,试图超越它们通常不会给你带来很好的结果。

您说大多数机器什么都不做 - 因此,为什么不“杀死”它们并在您有工作时开始新的机器?那不是更有效率吗?

于 2012-04-26T13:49:44.427 回答