GC运行后是否可以使用Sun JVM将内存释放到系统?

时间:2012-04-26 13:38:03

标签: java garbage-collection jvm jvm-hotspot

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

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

我正在使用:Linux x86_64 SMP,Java HotSpot(TM)64位服务器VM 1.6.0

2 个答案:

答案 0 :(得分:0)

  

这意味着当其中一台机器到来时 - 第一台,交换机被读入系统内存几十秒。

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

我建议:

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

答案 1 :(得分:0)

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

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

然而,如果您咨询互联网(例如When does System.gc() do anything),您将看到此调用可以调用垃圾收集系统。我个人的经历同意这个帖子。

由于内存管理是自动化的,垃圾收集系统将会发挥很大的作用,为您做好管理内存的工作。管理算法效率很高,试图超越它们通常不会给你带来很好的效果。

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