有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

多线程Java堆内存使用率波动

亲爱的开发者们,大家好

我在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) 个答案

  1. # 1 楼答案

    看起来好像有什么东西被垃圾收集了。记住,在一台拥有真实内存量的计算机上,这个斜率会小一千倍。我认为这不值得担心

  2. # 2 楼答案

    您的内存使用在0到20MB之间波动,并且没有增加。没有内存泄漏,也没有任何理由需要注意这一点

  3. # 3 楼答案

    如果您使用visualvmjconsolejmc来监视堆的使用情况,那么它将使用RMI和JMX,这会产生大量垃圾。i、 e.是您的监控在进行此操作

    顺便说一句,即使你有一个简单的程序

    System.in.read();
    

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

    我建议你试着改用

    jps -lvm
    

    获取进程id或pid

    jstat -gccause {pid} 10s
    

    监视内存使用情况。这也会产生少量的垃圾,远远少于这些垃圾