2012-04-26 108 views
0

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

完成任务后,有什么办法强制JVM向操作系统释放内存吗?例如,GC每隔1-5分钟运行一次,结果进程内存已经释放到系统中。

我使用的是:Linux的x86_64的SMP,Java的热点(TM)64位服务器VM 1.6.0

+1

我认为这是一个重复: http://stackoverflow.com/questions/324499/java-still-uses-system-memory-after-deallocation-of-objects-and-garbage-collecti – 2012-04-26 13:41:36

+0

作为精密:我从来没有找到有关这个主题的具体规范,但我已经看到(在Linux上)由进程释放的内存(但不是很多)。 – 2012-04-26 13:43:13

+0

为什么你需要单独的JVM来完成这些任务 - 为什么你不能仅仅使用一个短暂的任务被启动到一个线程池(使用java.util.concurrent的ExecutorService构造)呢? – kittylyst 2012-04-27 03:03:43

回答

0

这意味着,在时机成熟时对机器之一 - 第一,交换是读到系统内存几十秒。

内存页面只有在访问时才交换。如果您所说的500MB从JVM的角度来看确实是“免费的”,那么它们不会最终被换入.JVM触及内存的原因必然存在。一种可能性是它不是真的免费,但包含活的对象。

我会建议:

  1. 使用内存分析器(YourKit或VisualVM的)看到了JVM的实际内存使用情况。
  2. 可能调整堆的大小-Xmx
0

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

有一个对System.gc()的垃圾回收系统的调用。如果您参考系统(http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/System.html)的官方文档,它会告诉您这个方法运行垃圾收集。不过,如果你咨询互联网(如When does System.gc() do anything),你会看到这个调用可能会调用垃圾收集系统。我的个人经历与该职位一致。

由于内存管理是自动化的,所以垃圾收集系统将转到卓越的程度,为您做好管理内存的工作。管理算法非常高效,试图智胜他们通常不会给你带来很好的结果。

你说过大多数机器什么都不做 - 因此,为什么不“杀”它们并在你有工作时开始一个新的?这不会更有效吗?

+0

哦,是的!这很好,但我忘记说流程有内部触发器 - 而不是外部触发器。所以JVM必须运行,因为没有其他人知道什么时候触发:-) – Max 2012-04-26 13:58:43

相关问题