为什么是锯齿形图?

当我运行下面提到的代码(使用netbeans)时,分配的堆大小变化为锯齿形状。我从jVisualVM附加捕获,显示锯齿形状中使用的堆图。该程序是一个简单的无限循环打印“大声笑“n标准输出。

class one{
    static int i=0;
    public static void main(String a[]){
        while(i<10){
            System.out.println("lol");
        }
    }
}

在这里输入图像描述 任何人都可以解释使用堆图的形状背后的原因吗?

PS :即使我在不​​使用NetBeans的情况下运行它,也会发生这种情况,因此它与netbeans有点不相关......


堆使用中的锯齿模式可以通过在调用System.out.println调用期间创建几个局部变量来解释。 最值得注意的是在Oracle / Sun JRE中,在年轻一代中创建了几个HeapCharBuffer实例,如使用VisualVM的内存分析器获得的以下快照中所述:

可视VM  - 内存快照

有趣的是位于堆上的活动对象的数量。 锯齿图案源自伊甸园空间填满时发生的年轻代垃圾收集周期; 由于程序中没有执行繁重的计算活动,因此JVM能够执行循环的多次迭代,从而导致eden空间(4MB大小)填满。 接下来的年轻人收集周期清除掉大部分垃圾; 它几乎总是整个伊甸园空间,除非对象仍在使用中,正如从VisualVM获得的以下gc轨迹所示:

Visual VM GC探测器

锯齿图案的行为因此可以通过快速连续的一系列物体分配来解释,这些物体分配填满了伊甸园空间,从而触发了年轻的垃圾收集周期; 由于基础JVM进程没有被另一进程抢占,并且负责对象分配的JVM中的主线程也不会被另一个线程抢占,所以该进程循环重复,没有延迟。


任何以常规速率分配对象的进程都会导致堆内存消耗的稳步增加,然后当垃圾收集器收集不再使用的对象时会立即下降,从而导致锯齿形状。

如果您想知道为什么您的java进程在写入System.out保留了分配内存,请记住其他线程(例如将当前内存统计信息馈送给JVisualVM)可能是分配内存的那些线程。


它可能来自很多地方,并且可能取决于实施。 至少以下是可能的(但都只是猜测)

  • 在System.out.println下面的流栈中有一个字节数组分配(假设输出流的基本方法之一是write(bytes [] b,int off,int len))

  • 它是您正在使用的监控软件的开销(我没有使用它)

  • 它在NetBeans VM中开销最终显示输出

  • 链接地址: http://www.djcxy.com/p/79965.html

    上一篇: Why a sawtooth shaped graph?

    下一篇: Perform GC and CPU monitoring is disabled in VisualVM