Java - 对象越少,使用的内存就越大

标签 java performance memory jvm runtime

如果我创建 100,000 个对象,则使用的内存大于 10,000,000 个对象的使用内存。

为什么?

A.java

public class A {

    private static final int size = 1000*100;

    public static void main(String[] args) {
        double a = getMemoryInKilo();
        double start = getTime();
        for ( int i = 0 ; i < size ; i++ ) { 
            new B();
        }
        double stop = getTime();
        double b = getMemoryInKilo();
        System.out.println(b-a + " KB ---> " + (stop-start)/1000+" seconds");
    }

    private static double getTime(){
        return System.currentTimeMillis();
    }

    private static double getMemoryInKilo() {
        return (double)(Runtime.getRuntime().totalMemory()- Runtime.getRuntime().freeMemory())/1000;
    }

}

B.java

public class B {

    private final double k = 0;
    private final int a = 1;
    private final String s = "123456789";
    private final Object o = new Object();
    private final Integer i = 10;

}

结果:

  • 尺寸 = 1000*100:

    4135.576 KB ---> 0.016 秒

  • 尺寸 = 1000*100*100:

    2456.064 KB ---> 0.686 秒

我多次使用这些值运行程序并更改了顺序,但结果是相同的。 100,000 个对象的已用内存大于 10,000,000 个对象的已用内存。

详细信息:

  • Java 1.7
  • 操作系统:Windows 7
  • IDE:Eclipse Kepler

最佳答案

当你所做的只是

new B();

为了分配内存,运行时可以随时恢复分配的空间。您所看到的只是垃圾收集 Activity 模式之间的巧合差异。

您创建的每个“B”对象立即成为垃圾回收的候选对象。

关于Java - 对象越少,使用的内存就越大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26077025/

相关文章:

java - 为什么 for 循环索引不能正常工作?

java - Appengine java - 泽西/ jackson JaxbAnnotationIntrospector NoClassDefFoundError

java - 为什么在 Android 中会出现 Unparseable date 错误?

java - 位旋转 : interleave bytes in word with zero bytes using bitwise operators (<<, |、& 等)

performance - 最小化 Three.js 绘制的次数

java - 从 java 中的文档生成器列表中删除重复的 xml 元素

performance - 哪个英特尔微体系结构引入了ADC reg,0单uop特殊情况?

mysql - 如何让MySQL使用更少的内存?

python - 使用 Pandas 内置除法时出现内存错误,但循环有效?

python - 如何使用 `setrlimit` 来限制内存使用? RLIMIT_AS 杀得太快; RLIMIT_DATA, RLIMIT_RSS, RLIMIT_STACK 根本不杀死