Java堆内存使用量波动

时间:2015-12-11 19:13:50

标签: java multithreading memory garbage-collection heap-memory

亲爱的开发人员,您好

我在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应用程序行为的自然方式?

JConsole

提前致谢...

3 个答案:

答案 0 :(得分:3)

您的内存使用量在0到20MB之间波动而不会增加。没有内存泄漏或任何理由你应该注意这一点。

答案 1 :(得分:2)

看起来有些东西正在收集垃圾。请记住,在具有实际数量的主存储器的计算机上,该斜率将显示小一千倍。我不认为值得担心。

答案 2 :(得分:2)

如果您使用visualvmjconsolejmc来监控堆使用情况,它会使用RMI和JMX,这会产生大量垃圾。也就是说你正在进行监控。

即使你有一个简单的程序,也可以BTW

System.in.read();

这些工具将显示正在创建垃圾,但不会由您的程序创建。

我建议您尝试使用

jps -lvm

获取流程ID或pid

jstat -gccause {pid} 10s

监视内存使用情况。这也会产生少量垃圾。