输出XML deserialisation期间的记忆(Out of memory during XM

2019-10-21 00:32发布

我去 - 我的序列化XML的异步任务。 在某些特定情况下,我走出去的同时系列化内存不足的错误。 我知道有一个所谓的标志largeHeap ,我可以在我的应用程序中使用。 但是,有没有办法找出具体避免在那个地方。

按我发现System.gc()是不是可能解决它一个最佳的解决方案。 任何人可以帮助我通过它。 下面的代码片段。

private HashMap<String, Game> games = new HashMap<String, Game>();

public void load(LocalDatabaseHelper localDbHelper) throws Exception
{
    synchronized(gameLockObject) {
        GameDetailDAO dao = new GameDetailDAO(localDbHelper);

        //this will fetch me the all the entities from databse
        ArrayList<GameDetailEntity> dbGameDetails = dao.getEntities(null, null);

        for (GameDetailEntity gameDetail : dbGameDetails) {
            String gameLevel = gameDetail.getDetailLevel();             

            String gameXml = gameDetail.getGameData();

            Game game = null;
            if(gameLevel.equalsIgnoreCase("Novice")) {
                game = Job.deserialiseJob(gameXml, NoviceLevel.class);
            }
            else if (gameLevel.equalsIgnoreCase("Expert")) { 
                game = Job.deserialiseJob(gameXml, ExpertLevel.class);
            }

            //set the job version
            game.setGameversion(gameDetail.getGameVersion());
            game.setMagicNumber(gameDetail.getMagicNumber());
            game.setInactiveUser(gameDetail.getInactiveUser());
            game.setStartTime(gameDetail.getStartTime());
            game.setFinishTime(gameDetail.getFinishTime());
            game.setGameCompletionTime(gameDetail.getGameCompletionTime());
            if (!StringUtils.isNullOrEmpty(gameDetail.getGameStatus())) {
                game.setGameStatus(GameStatus.valueOf(gameDetail.getGameStatus()));
            }

            //add the job to the store
            games.put(gameDetail.getGameRef().toLowerCase(Locale.getDefault()), game);
        }
    }
}

Answer 1:

这个问题是不是在你的应用程序的任何特定的代码,它与基本设计。 你有你想办理一次实在太多数据。

不要序列数据(特别是不要使用XML,我猜你不需要任何标记来开始)。

相反,存储游戏的所有数据在正确规范化的数据库(一切即使用表/列)。 在一次不加载的一切,但只装载尽可能多的实际需要。



Answer 2:

我遇到了问题,因为一个简单的原因,字符串的大小是巨大的。 巨大。 Si单的解决办法是减少被处理的数据量。 所以我决定减少字符串的大小。 我从XML分离的图像数据,并存储在不同的表。 这减少需要反序列化的数据量。 我单独重新加载额外的数据。 感谢您的解答,并为您的宝贵时间。



文章来源: Out of memory during XML deserialisation