我最近在我的程序中添加了这段代码,现在它似乎崩溃了,因为内存不足。
这是我观察到的:
执行这段代码多次(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;
}
我的假设是,在运行此代码后,servers
和gameDAO
将被删除。并且之前对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();
public static VotingSite getVotingSite() {
if (votingSite == null) {
votingSite = new VotingSite();
updateServers();
}
return votingSite;
}
我的假设是对的吗?什么是解决我的问题的合适解决方案。?
答案 0 :(得分:0)
我为我找到了问题。
我忘记了preparedStatement.close();
在updateServers();
因此,准备好的语句将始终保持opend状态并且内存会增加。因为我已经添加了关闭记忆似乎是一个稳定的速度。
Memory graph after adding preparedStatement.close();