Java中的内存泄漏应该不会发生

时间:2018-02-26 19:57:11

标签: java memory

我最近在我的程序中添加了这段代码,现在它似乎崩溃了,因为内存不足。

这是我观察到的:

执行这段代码多次(1000次)。 记忆将增加一倍甚至三倍。当我手动提示垃圾收集器时,它似乎没有减少数量。

我的代码

public void updateServers() {
    Servers servers = new Servers();
    GameDAO gameDAO = new GameDAO();
    ArrayList<CachedServerPOJO> lastList = new ArrayList<>();
    ArrayList<CachedServerPOJO> playersList = new ArrayList<>();
    ArrayList<CachedServerPOJO> premiumList = new ArrayList<>();
    ArrayList<CachedServerPOJO> scoreList = new ArrayList<>();
    this.gamesPOJOS = gameDAO.getGames();
    for (GamesPOJO gamesPOJO : gamesPOJOS) {
        CachedServerPOJO lastUpdated = new CachedServerPOJO(servers.getServers("last", gamesPOJO.getName()), gamesPOJO.getName());
        CachedServerPOJO score = new CachedServerPOJO(servers.getServers("score", gamesPOJO.getName()), gamesPOJO.getName());
        CachedServerPOJO players = new CachedServerPOJO(servers.getServers("players", gamesPOJO.getName()), gamesPOJO.getName());
        CachedServerPOJO premium = new CachedServerPOJO(servers.getServers("premium", gamesPOJO.getName()), gamesPOJO.getName());
        lastList.add(lastUpdated);
        playersList.add(players);
        premiumList.add(premium);
        scoreList.add(score);
        System.out.println("Updated all servers on homepage");
    }
    this.lastUpdatedServers = lastList;
    this.serversBasedOnPlayers = playersList;
    this.serversBasedOnPremium = premiumList;
    this.serversBasedOnScore = scoreList;
}

我的假设是,在运行此代码后,serversgameDAO将被删除。并且之前对lastUpdatedServers等堆的崇敬将被删除。 这样内存不应该增加。 但它仍然如此。 要么我错过了一些东西,要么我做出了错误的假设。

我希望如果没有提供足够的信息,请告诉我,我会添加更多信息。

修改

到目前为止我发现的问题可能是因为它是从静态上下文访问的。我的假设是静态对象即使不再被引用也不会从内存中删除。

这是我使用的一些代码: 应更新所有值的更新方法。 这将每1分钟运行一次,以更新arraylists。

 private static Servers serversClass = new Servers();
private static GameDAO gameDAO = new GameDAO();
public static void updateServers() {
    ArrayList<CachedServerPOJO> lastList = new ArrayList<>();
    ArrayList<CachedServerPOJO> playersList = new ArrayList<>();
    ArrayList<CachedServerPOJO> premiumList = new ArrayList<>();
    ArrayList<CachedServerPOJO> scoreList = new ArrayList<>();
    votingSite.setGamesPOJOS(gameDAO.getGames());
    for (GamesPOJO gamesPOJO : votingSite.getGamesPOJOS()) {
        CachedServerPOJO lastUpdated = new CachedServerPOJO(serversClass.getServers("last", gamesPOJO.getName()), gamesPOJO.getName());
        CachedServerPOJO score = new CachedServerPOJO(serversClass.getServers("score", gamesPOJO.getName()), gamesPOJO.getName());
        CachedServerPOJO players = new CachedServerPOJO(serversClass.getServers("players", gamesPOJO.getName()), gamesPOJO.getName());
        CachedServerPOJO premium = new CachedServerPOJO(serversClass.getServers("premium", gamesPOJO.getName()), gamesPOJO.getName());
        lastList.add(lastUpdated);
        playersList.add(players);
        premiumList.add(premium);
        scoreList.add(score);
        System.out.println("Updated all servers on homepage");
    }
    votingSite.setLastUpdatedServers(lastList);
    votingSite.setServersBasedOnPlayers(playersList);
    votingSite.setServersBasedOnPremium(premiumList);
    votingSite.setServersBasedOnScore(scoreList);
}

如何使用这些值

serversPOJOS = votingSite.getLastUpdatedServers().stream().filter(x -> x.getGameName().equalsIgnoreCase(game)).findFirst().orElse(null).getServersPOJOS();

如何使用方法updateServers() 这是一个正在运行的地方。它也在Weblistener.updateServers();

的runnable中运行
    public static VotingSite getVotingSite() {
    if (votingSite == null) {
        votingSite = new VotingSite();
        updateServers();
    }
    return votingSite;
}

我的假设是对的吗?什么是解决我的问题的合适解决方案。?

1 个答案:

答案 0 :(得分:0)

我为我找到了问题。

我忘记了preparedStatement.close();updateServers();

调用的方法中

因此,准备好的语句将始终保持opend状态并且内存会增加。因为我已经添加了关闭记忆似乎是一个稳定的速度。 Memory graph after adding preparedStatement.close();