繁体   English   中英

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

[英]Is it possible to release memory to system with Sun JVM after GC run?

操作系统正在运行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

这意味着当时间到了其中一台机器时(第一台机器),交换将被读取到系统内存中数十秒钟。

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

我建议:

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

我不是性能问题方面的专家,但是请允许我帮助您。

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

但是,如果您查阅Internet(例如System.gc()什么时候做任何事情 ),您将看到此调用可以调用垃圾回收系统。 我的个人经历同意该职位。

由于内存管理是自动化的,因此垃圾收集系统将竭尽全力为您管理内存。 管理算法非常有效,并且通常试图使它们不明智,却无法获得出色的结果。

您说过,大多数机器什么都不做-因此,为什么不干活就杀死它们并开始新的机器呢? 那不是更有效吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM