我在尝试调试应用程序中的内存泄漏时偶然发现了这一点。我的计算机所连接的网络正在迁移,当拔掉交换机时,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/