Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多个POST请求占用内存(htop)_Java_Ubuntu_Memory_Rabbitmq_Httpurlconnection - Fatal编程技术网

Java 多个POST请求占用内存(htop)

Java 多个POST请求占用内存(htop),java,ubuntu,memory,rabbitmq,httpurlconnection,Java,Ubuntu,Memory,Rabbitmq,Httpurlconnection,我会尽量简明扼要。我有一个程序可以: 使用来自RabbitMQ服务器的JSON字符串消息 提取重要字段并将它们放入另一个JSON(不同的结构)中。我使用的是Jackson解析器中的POJO模型 通过HTTP POST请求将它们发送到服务器。使用HttpUrlConnection(每条消息一个连接)和DataOutputStream#write(字节[]) 我有3个使用者(3个线程,每个线程使用一个不同的队列)执行这3个步骤,效果很好。然而,我收到的消息量非常大(一小时内500条消息),而且请求似

我会尽量简明扼要。我有一个程序可以:

  • 使用来自RabbitMQ服务器的JSON字符串消息
  • 提取重要字段并将它们放入另一个JSON(不同的结构)中。我使用的是Jackson解析器中的POJO模型
  • 通过HTTP POST请求将它们发送到服务器。使用HttpUrlConnection(每条消息一个连接)和DataOutputStream#write(字节[])
  • 我有3个使用者(3个线程,每个线程使用一个不同的队列)执行这3个步骤,效果很好。然而,我收到的消息量非常大(一小时内500条消息),而且请求似乎正在慢慢但逐步地消耗驻留内存。堆是稳定的,垃圾收集器会定期清理堆

    问题可能出在:

  • 我的RabbitMQ消费者:在确认之前,他们被限制为1条消息(qos=1),所以我认为问题不在这里
  • HttpURLConnection对象:我认为这是个问题,因为如果我们只使用数据,内存是稳定的
  • 使用探查器,我可以看到堆不断增长,直到达到峰值,然后垃圾收集器将其清理(请参见附图):


    如何控制使用的驻留内存?我能做些什么来控制大量的POST请求吗?

    如何维护一个
    HttpURLConnection
    池,而不是为每条消息创建一个新池?这并不是真正的资源泄漏,因为GC能够回收连接使用的所有mem,只是没有达到最佳设计……好吧,我没有将它们集中起来,因为:“每个HttpURLConnection实例用于发出单个请求,但与HTTP服务器的底层网络连接可能会被其他实例透明地共享。在请求后对HttpURLConnection的InputStream或OutputStream调用close()方法可能会释放与此实例关联的网络资源,但对任何共享的持久连接都没有影响。如果一个持久连接当时处于空闲状态,调用disconnect()方法可能会关闭底层套接字。”。是这样吗?也许我误解了。