1

我试图找出 JVM Heap Size 与 Object creation 有何不同。

例如,如果您看到我下面的程序,我在 for 循环中创建了 10000 个字符串对象,但在我的 JVM 环境中的堆大小仍然没有区别。

public class One {

    public static void main(String args[]) {

        long heapSizebefore = Runtime.getRuntime().totalMemory();
        System.out.println("heapSizebefore" + heapSizebefore);

        for (int i = 0; i <= 10000; i++) {
            String str = new String();

        }

        long heapSizeafter = Runtime.getRuntime().totalMemory();
        System.out.println("heapSizeafter" + heapSizeafter);

    }

}
4

4 回答 4

4

调用totalMemoryjust 会为您提供 Java 进程保留的内存量。这并不意味着它正在被堆上的对象主动填充。正如javadocs所说,它是当前和未来对象可用的内存总量。

事实上,Java 更愿意从底层操作系统请求大块内存,而不是malloc每次创建新对象时都必须调用(或等效)。

如果要跟踪堆的实际大小,可以使用 JConsole/JVisualVM 等工具简单地实时执行此操作,或者使用内存分析器更详细地执行此操作。如果您想以编程方式执行此操作,则需要为复杂的东西注册一个代理,但堆详细信息通过 JMX 公开。查看java.lang:MemoryMBean 的HeapMemoryUsage属性(JConsole 使用它来显示内存图表)。

于 2012-06-14T15:19:38.480 回答
2

JIT 也可能会优化整个for循环,因为它没有副作用。

于 2012-06-14T15:19:51.900 回答
2

两个原因:

  1. 您正在测量为堆保留的内存量,而不是活动对象大小的总和。
  2. 无论如何,您都不会保留对已分配字符串的引用,因此 JVM 可以随时对它们进行垃圾收集。
于 2012-06-14T15:20:59.823 回答
0

基本上我想知道为什么我们在 Java 中使用静态方法。

因为静态方法比实例方法简单。

所以我的问题是节省内存(从对象创建)我们使用静态方法??

不,你应该有目的地编码,只创建你真正需要的东西。需要时创建实例,不需要时不要创建实例。这不是出于性能原因,而是为了减少代码的概念权重。如果您必须维护您的代码或其他一些代码,您需要找出为什么要做某事,并且需要更长的时间才能确定无意义的代码确实是无意义的。即寻找不存在的东西比寻找存在的东西要花更长的时间。


为了支持多线程内存分配,每个线程都有一个线程本地分配缓冲区或TLAB

可用空间仅显示公共池中有多少可用空间,但不能显示每个线程的 TLAB 中可用的大小。如果您分配了足够多的字符串,您将看到内存使用量在加载另一个块时突然跳跃。

你可以做的是关闭它-XX:-UseTLAB

// -XX:+UseTLAB heapUsedBefore: 5,368,848 heapUsedAfter: 5,368,848
// -XX:-UseTLAB heapUsedBefore: 535,048 heapUsedAfter: 535,096

public class One {
    public static void main(String... args) {
        Runtime runtime = Runtime.getRuntime();
        long heapUsedBefore = runtime.totalMemory() - runtime.freeMemory();

        String str = new String();

        long heapUsedAfter = runtime.totalMemory() - runtime.freeMemory();
        System.out.printf("heapUsedBefore: %,d heapUsedAfter: %,d%n", 
                           heapUsedBefore, heapUsedAfter);
    }
}
于 2012-06-14T15:25:13.877 回答