GC_FOR_ALLOC因为调用静态方法?

时间:2013-12-26 15:50:04

标签: java android garbage-collection

我有数百个

12-26 10:28:42.383: D/dalvikvm(3341): GC_FOR_ALLOC freed 1122K, 18% free 5834K/7112K, paused 57ms, total 57ms

由于静态方法(有时会递归调用),我会调用数百次。在这种方法中,我有ArrayList<HashMap<String,String>>
我如何减少内存使用量?

方法叫做:

public static ArrayList<HashMap<String, String>> getTimetableGroupsByType( String typeId ) throws IOException
{
    ArrayList<HashMap<String, String>> timetableItems = new ArrayList<HashMap<String, String>>();
    Document doc = Jsoup.connect("https://plan.polsl.pl/left_menu.php?type=" + typeId).get();
    Elements lists = doc.getElementsByTag("ul");
    for(Element list : lists){

        for( Element item : list.getElementsByTag("li")){
            HashMap<String, String> timetableItem = new HashMap<String, String>();

            timetableItem.put("name", item.text());
            timetableItem.put("id_type", typeId);


            if( ! item.id().equals(""))
            {
                //Log.d("ATS4Handler", item.id() );
                timetableItem.put("id", item.id());
                timetableItem.put("expansible_group", "true");
                timetableItems.add(timetableItem);
                timetableItems.addAll( getTimeTableItemsByGroups( typeId, item.id() ) );
            }
            else{
                String[] itemHref =  item.getElementsByTag("a").first().attr("href").split("=");
                Matcher m = Pattern.compile("([a-zA-Z]+)=([0-9]+)").matcher( item.getElementsByTag("a").first().attr("href") );
                HashMap<String, String> link = new HashMap<String, String>();
                while (m.find())
                    link.put(m.group().split("=")[0], m.group().split("=")[1]);

                timetableItem.put("typeId", typeId);
                timetableItem.put("id", link.get("id").toString() );
                timetableItem.put("expansible_group", "false");
                timetableItems.add(timetableItem);
            }

        }           
    }
    return timetableItems;
}

1 个答案:

答案 0 :(得分:2)

如果我已正确阅读您的代码,您使用HashMap个实例来表示代表时间表项目的“记录”。 HashMap是一种(相对)昂贵的数据结构,它使用(相对)大量的空间。相反,您应该编写并使用包含5个字段的自定义类。这将保存(可能)用于表示项目数据结构的2/3个spave。

另一个问题是你的“链接”HashMap似乎完全没必要。相反,您可以在简单的String变量中保存与键“id”关联的值。这样做可以大大降低对象分配率。

但是,最大的内存使用者可能是您从JSoup获得的Document对象。理想情况下,您不希望创建表示要解析的整个文档的Document对象。不幸的是,JSoup不支持基于事件的解析。