java - GC_FOR_ALLOC因为调用静态方法?

标签 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;
}

最佳答案

如果我正确地阅读了您的代码,那么您正在使用 HashMap 实例来表示代表时间表项目的“记录”。 HashMap 是一种(相对)昂贵的数据结构,使用(相对)大量的空间。相反,您应该编写并使用具有 5 个字段的自定义类。这将节省(可能)您用来表示项目数据结构的 Spave 的 2/3。

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

但是,最大的内存消耗可能是您从 JSoup 获取的 Document 对象。理想情况下,您不想创建一个代表您正在解析的整个文档的 Document 对象。不幸的是,JSoup 不支持基于事件的解析。

关于java - GC_FOR_ALLOC因为调用静态方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20787465/

相关文章:

java - 私有(private)字符串还是公共(public)静态字符串?

java - 使用restfb在Facebook feed中获取自动位置

android - 如何在 android webview 中禁用双击缩放?

java - 在 Android Java 应用程序中使用 OpenCV Mat。 OpenCV 垫的 NoClassDefFound 错误

objective-c - 使用垃圾收集时,新创建的 Cocoa 应用程序会出现内存泄漏吗?

java - 如何获取转发的转发者列表?

java - JSF:AJAX 测试最佳实践

java - 将字符串转换为大数浮点型

java - 在 C# 和 java(具有 GC 的语言)中访问硬编码映射或数组等的最佳方法

java - 由于任期空间的压缩,.hashcode() 会返回不同的 int 吗?