InputStream 导致内存泄漏

InputStream causing memory leaks

我正在使用 Restlet Framework,但我的问题更笼统 Java 关于 Streams 的问题。我有这样的代码,returns GET HTTP 请求上的“blob”数据/文件:

@Override
public Representation getBlob() {
   InputStream is = entityRepository.getEntityBlob(appId, namespace, entityType, entityId, blobName);
   Representation representation = new InputRepresentation(is);
   representation.setMediaType(MediaType.APPLICATION_OCTET_STREAM);
   representation.setSize(count);
   return representation;
}

我也在使用 k6.io 负载测试来测试此资源,针对 1000 个活动连接测试此资源 10 分钟,没有任何问题,但同样的机器和资源在测试更多时间后,例如几个小时,然后它开始吃掉机器的所有内存,最终导致它停止。

这里似乎有“漏洞”,但我无法确定,因为根本没有错误。

更新:

这是它的样子:

public class BlobHashServerResource extends BaseServerResource implements BlobHashResource {
   @Override
   public Representation getBlob() { 
      //... 
   }
}

这个 BlobHashServerResource 映射到

public class BackendApplication extends Application {
  @Override
  public Restlet createInboundRoot() {
     router.attach("blobs/{blobHash}", BlobHashServerResource.class);
     return router; 
  }
}

web.xml

  <servlet>
    <servlet-name>RestletServlet</servlet-name>
    <servlet-class>org.restlet.ext.servlet.ServerServlet</servlet-class>
    <init-param>
      <param-name>org.restlet.application</param-name>
      <param-value>com.mycompany.BackendApplication </param-value>
    </init-param>
  </servlet>

这个问题的解决方案是更新 Restlet Framework 版本,因为这是一个已知的 InputStream issue/bug 用于较旧的 Restlet 版本,但是一些 Restlet 包没有 2.4.0 版本所以我也此处显示测试的兼容版本:

    <properties>
       <version.restlet>2.4.0</version.restlet>
    </properties>
   
    <dependencies>
       <!-- Restlet -->
        <dependency>
            <groupId>org.restlet.jee</groupId>
            <artifactId>org.restlet</artifactId>
            <version>${version.restlet}</version>
        </dependency>
        <dependency>
            <groupId>org.restlet.jee</groupId>
            <artifactId>org.restlet.ext.fileupload</artifactId>
            <version>${version.restlet}</version>
        </dependency>
        <dependency>
            <groupId>org.restlet.jee</groupId>
            <artifactId>org.restlet.ext.servlet</artifactId>
            <version>${version.restlet}</version>
        </dependency>
        <dependency>
            <groupId>org.restlet.jee</groupId>
            <artifactId>org.restlet.ext.swagger</artifactId>
            <version>${version.restlet}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.raml</groupId>
                    <artifactId>raml-parser</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.restlet.jee</groupId>
            <artifactId>org.restlet.ext.xstream</artifactId>
            <!--version>${version.restlet}</version-->
            <version>2.3.12</version>
            <exclusions>
                <exclusion>
                    <groupId>org.codehaus.jettison</groupId>
                    <artifactId>jettison</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.thoughtworks.xstream</groupId>
                    <artifactId>xstream</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.restlet.jee</groupId>
            <artifactId>org.restlet.ext.apispark</artifactId>
            <version>2.3.12</version>
            <exclusions>
                <exclusion>
                    <groupId>org.raml</groupId>
                    <artifactId>raml-parser</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.restlet.jee</groupId>
            <artifactId>org.restlet.ext.json</artifactId>
            <version>${version.restlet}</version>
        </dependency>
    </dependencies>