java在GC运行后,是否可以使用Sun JVM向系统释放内存?
操作系统运行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
# 1 楼答案
内存页只有在被访问时才会被交换。如果从JVM的角度来看,你所说的500MB真的是“免费”的,那么它们最终不会被交换。JVM接触内存肯定是有原因的。一种可能性是,它不是真正免费的,但包含活动对象
我建议:
-Xmx
调整堆的大小李># 2 楼答案
我不是性能问题的专家,但让我试着帮你解决这个问题
有一个对垃圾收集系统的调用。gc()。如果您查阅类系统(http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/System.html)的官方文档,它会告诉您该方法运行垃圾收集
然而,如果你查阅互联网(比如When does System.gc() do anything),你会发现这个调用可能会调用垃圾收集系统。我的个人经历与那篇文章相符
由于内存管理是自动化的,垃圾收集系统将花费大量时间为您管理好内存。管理算法非常有效,试图智胜它们通常不会带来好的结果
你说大多数机器什么都不做——因此,当你有工作时,为什么不“杀死”它们并开始一个新的机器呢?这样不是更有效率吗