JVM使用堆增长,同时具有Internet连接

时间:2015-12-03 08:56:37

标签: java memory jvm heap-memory

我在尝试调试应用程序中的内存泄漏时偶然发现了这种情况。我的计算机所连接的网络正在迁移,当交换机被拔掉时,JVM使用的堆停止增长。

当计算机具有活动的网络连接时,JVM使用的内存会增长(最终会获得GC)。这适用于有和没有互联网连接的java程序。

Example.java:

public class Example {

    public static void main(String[] args) {

        while (true){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

如果运行Visual VM,您会注意到使用的内存稳定增长。如果你要与你断开连接,请将它排成一行。

我不幸无法上传图片,因为netowork不允许我。

为什么会这样?

编辑:如果重新连接电缆,则使用的堆将再次开始增长

1 个答案:

答案 0 :(得分:1)

VisualVM使用相当多的内存来运行。它通过JMX进行了大量的RMI调用,这会产生相当多的垃圾。

其中一些调用会检查正在使用的IP地址的DNS名称,因此当您将网络拉出时,很可能是您要停止运行或导致其超时,从而大幅降低其采样率。

您可以将VisualVM配置为不经常采样,但您也可以使用不会产生大量垃圾的探查器。

BTW为了测试一个没有做任何事情的程序,我使用

System.in.read();

要以更轻量级的方式监控内存使用情况,您可以使用jstat -gcusage {pid}这会产生更少的垃圾。