我在异步任务中取消序列化我的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);
}
}
}
答案 0 :(得分:1)
问题不在于您应用中的任何特定代码,而是基本设计。 你有太多的数据,你一次尝试处理。
不要序列化数据(特别是不要使用XML;我猜你不需要任何标记开始)。
相反,将游戏的所有数据存储在正确规范化的数据库中(即,使用表/列表示所有内容)。 不要一次加载所有内容,而是只加载实际需要的内容。
答案 1 :(得分:0)
我遇到了问题,原因很简单,字符串的大小很大。巨大。 Si简单的解决方案是减少正在处理的数据量。所以我决定减少字符串的大小。我已将图像数据与XML隔离并存储在不同的表中。这减少了反序列化所需的数据量。我分别重新加载额外的数据。感谢您的回答和宝贵的时间。