Playframework 在游戏中评测内存使用情况!框架

Playframework 在游戏中评测内存使用情况!框架,playframework,akka,Playframework,Akka,我有一个剧本!框架应用程序,我已经在生产中运行了3年。 但是,最近我将版本升级到了2.8(从2.5升级到2.8),并且需要更改一些已折旧的函数。在这个过程中,我开始使用更多的阿克卡演员 然而,现在我的内存在一段时间(2-5天)内耗尽,这是以前从未发生过的。由于升级是一次大的重写,我无法轻松返回,因此我想知道是否有一个简单的方法可以解释为什么我的内存使用量一直在增加。当内存几乎达到最大值时,Akka Webstreah停止响应(但还没有PermGen错误) 我添加了15分钟的内存检查并保存了值,下

我有一个剧本!框架应用程序,我已经在生产中运行了3年。 但是,最近我将版本升级到了2.8(从2.5升级到2.8),并且需要更改一些已折旧的函数。在这个过程中,我开始使用更多的阿克卡演员

然而,现在我的内存在一段时间(2-5天)内耗尽,这是以前从未发生过的。由于升级是一次大的重写,我无法轻松返回,因此我想知道是否有一个简单的方法可以解释为什么我的内存使用量一直在增加。当内存几乎达到最大值时,Akka Webstreah停止响应(但还没有PermGen错误)

我添加了15分钟的内存检查并保存了值,下面的图表就是结果,它清楚地显示了一个增量结果

我最初认为这是一个新的阿克卡演员创造的问题,而不是被释放。虽然演员的数量在增加,但在使其中一些演员成为单身(其中没有变量)之后,情况似乎并非如此

有没有办法看看是什么带走了这段记忆?我希望它是有参考的东西,因此内存不会被释放,但如果没有线索,就很难找到

[编辑] 运行MAT后,似乎akka.actor.ActorCell与我发送给客户端的所有JSON数据一起被保留。这就是程序。没有公布数据有什么原因吗?我是否需要使用物化器或源来创建某些内容

 private void sendDeviceData(List<Device> devices){
    ObjectNode response = Json.newObject();
    ObjectNode statusScreen = response.putObject("statusScreen");
    ArrayNode items = statusScreen.putArray("devices");         
    for(Device device : devices) {
        items.add(Json.parse(device.getStatusJson()));
    }
    Source<JsonNode, NotUsed> source = Source.single(response);
    source.to(hubSink).run(mat);
}
private void发送设备数据(列出设备){
ObjectNode响应=Json.newObject();
ObjectNode statusScreen=response.putObject(“statusScreen”);
ArrayNode items=statusScreen.putArray(“设备”);
用于(设备:设备){
add(Json.parse(device.getStatusJson());
}
源=源。单个(响应);
source.to(hubSink.run)(mat);
}
[编辑2] 请查看附件中的垃圾场截图。似乎出于某种原因,它都是嵌套的


尝试使用
jmap
(请参阅)收集堆转储,然后在EclipseMat()或任何其他内存分析器中对其进行分析。很好,返回的结果是“akka.actor.ActorCell”占用了92%的内存。似乎所有通过WS发送到webintrface的数据都嵌套在一起。我更新了我的代码。你是如何创建你的演员的?每个请求一个参与者?请注意,只有在显式停止的情况下才会停止参与者:仅仅因为没有指向参与者的活动的
ActorRef
s不会导致参与者停止,也不会回收
ActorCell
持有的状态。因此,如果您要为每个请求生成一个actor,那么您必须在请求之后停止actor。AbstractNodeQueue条目很可能是actor的邮箱,因此出现ActorCell也就不足为奇了,它是拥有该邮箱的实际actor实现。听起来好像有一个参与者没有处理它的邮箱(足够快)。我会查看MAT中的直方图,看看可能是哪种消息类型。我想我可能已经发现了问题。为了将消息发送回客户端,我使用了“source.to(hubSink.run(mat);”。当我把它改为“hubSink.runWith(source,mat);”明显的记忆增长停止了。我现在需要对内存转储进行长时间运行,看看它是否真的这样做了。