亲爱的开发人员,您好
我在java应用程序中遇到堆内存使用问题。 应用程序本身只接受Socket连接
主线程我没有其他脚本(静态ExecutorService实例除外):
ServerSocketFactory serverFactory = ServerSocketFactory.getDefault();
ServerSocket server = serverFactory.createServerSocket(Configuration.port);
for(;;)
{
Socket client = server.accept();
Configuration.getExecutor().submit(new Client(client));
}
当应用程序运行时,它应该阻止循环,直到有人连接... 这意味着我的主线程大部分时间处于等待状态......
问题是:当没有人连接到我的服务器时,堆内存使用量会有波动(见下面的截图) 这意味着内存泄漏?没有?或者这是java应用程序行为的自然方式?
提前致谢...
答案 0 :(得分:3)
您的内存使用量在0到20MB之间波动而不会增加。没有内存泄漏或任何理由你应该注意这一点。
答案 1 :(得分:2)
看起来有些东西正在收集垃圾。请记住,在具有实际数量的主存储器的计算机上,该斜率将显示小一千倍。我不认为值得担心。
答案 2 :(得分:2)
如果您使用visualvm
或jconsole
或jmc
来监控堆使用情况,它会使用RMI和JMX,这会产生大量垃圾。也就是说你正在进行监控。
System.in.read();
这些工具将显示正在创建垃圾,但不会由您的程序创建。
我建议您尝试使用
jps -lvm
获取流程ID或pid
jstat -gccause {pid} 10s
监视内存使用情况。这也会产生少量垃圾。