Java 在释放对象和垃圾回收后仍然使用系统内存

标签 java memory-management memory-leaks garbage-collection

我正在运行 JVM 1.5.0(Mac OS X 默认值),并且正在 Activity 监视器中监视我的 Java 程序。我有以下内容:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Date;

public class MemoryTest {

public static void memoryUsage() {
 System.out.println(
     Runtime.getRuntime().totalMemory() - 
     Runtime.getRuntime().freeMemory()
 );
}

public static void main( String[] args ) throws IOException {

    /* create a list */
    ArrayList<Date> list = new ArrayList<Date>();

    /* fill it with lots of data */
    for ( int i = 0; i < 5000000; i++ ) {
        list.add( new Date() );
    } // systems shows ~164 MB of physical being used

    /* clear it */
    memoryUsage();      //  about 154 MB
    list.clear();
    list = null;
    System.gc();
    memoryUsage();      //  about 151 KB, garbage collector worked

    // system still shows 164 MB of physical being used.
    System.out.println("Press enter to end...");
    BufferedReader br = new BufferedReader( 
            new InputStreamReader( System.in )
            );
    br.readLine();
}

那么,即使垃圾收集器看起来工作正常,为什么物理内存没有被释放?

最佳答案

许多 JVM 从不将内存返回给操作系统。它是否这样做是特定于实现的。对于那些不这样做的,通常通过 -Xmx 标志在启动时指定的内存限制是为其他应用程序保留内存的主要方式。

我很难找到关于这个主题的文档,但是 garbage collector documentation for Sun's Java 5确实解决了这个问题,建议在正确的条件下,如果使用正确的收集器,堆将会缩小——默认情况下,如果超过 70% 的堆是空闲的,它将缩小到只有 40% 是空闲的。控制这些的命令行选项是 -XX:MinHeapFreeRatio-XX:MaxHeapFreeRatio

关于Java 在释放对象和垃圾回收后仍然使用系统内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/324499/

相关文章:

java - XML 中的 Hibernate validator 约束

java - 如何在 Spring JPA Web 应用程序中设置一些 Hibernate 属性?

c++ - 使用 valgrind 查找 mysql c++ 客户端中的内存泄漏

node.js - Node JS : How to debug "EventEmitter memory leak detected. 11 listeners added"

java - Tomcat 内存泄漏

java - 如果引用的静态字段是最终的,为什么不执行静态初始值设定项

java - 什么时候为java中的静态变量分配内存?

java - 在 Java 中使用 finalize() 是否合适?

c++ - 内存分配练习

java - Android TextView Marquee 以编程方式