有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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


共 (2) 个答案

  1. # 1 楼答案

    This means that when the time comes to one of the machines - the first, swap is read to system memory for tens of seconds.

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

    我建议:

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

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

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

    然而,如果你查阅互联网(比如When does System.gc() do anything),你会发现这个调用可能会调用垃圾收集系统。我的个人经历与那篇文章相符

    由于内存管理是自动化的,垃圾收集系统将花费大量时间为您管理好内存。管理算法非常有效,试图智胜它们通常不会带来好的结果

    你说大多数机器什么都不做——因此,当你有工作时,为什么不“杀死”它们并开始一个新的机器呢?这样不是更有效率吗