java - 当有互联网连接时,JVM 已用堆会增长

标签 java memory jvm heap-memory

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

当计算机有 Activity 的网络连接时,JVM 使用的内存会增加(最终会进行 GC)。这适用于有或没有互联网连接的 java 程序。

示例.java:

public class Example {

    public static void main(String[] args) {

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

如果您运行 Visual VM,您会注意到使用的内存稳定增长。如果您要断开网络连接,它就会变平。

不幸的是,我无法上传图像,因为网络不允许我上传图像。

这是为什么?

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

最佳答案

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

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

您可以将 VisualVM 配置为减少采样频率,但您也可以使用不会产生太多垃圾的分析器。

顺便说一句,要测试一个程序不执行我使用的任何操作

System.in.read();

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

关于java - 当有互联网连接时,JVM 已用堆会增长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34061567/

相关文章:

java - MyBatis 中 mapUnderscoreToCamelCase 的行为

java - 似乎无法弄清楚为什么我的循环不会进行

eclipse - 有没有办法指示 Eclipse 在最小化时卸载内存?

java - 在 Java 中模拟 6502 处理器时,对象开销重要吗? (使用包装器而不是原始类型)

java - 错误的 ELF 类 : ELFCLASS32

java - 由于无限循环导致 AspectJ 堆栈溢出错误

java - 如何强制我在 Spring 中的所有页面使用 https 协议(protocol)

objective-c - malloc 后 char* 大小与预期不同

java - JVM 如何优化 Fluent api

java - JVM 进程大小和内存堆大小之间的巨大差异