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>
我正在使用 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>