Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 由于调用静态方法,GC_FOR_ALLOC?_Java_Android_Garbage Collection - Fatal编程技术网

Java 由于调用静态方法,GC_FOR_ALLOC?

Java 由于调用静态方法,GC_FOR_ALLOC?,java,android,garbage-collection,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 如何减少内存的使用 方法调用: public static ArrayList<HashMap<String, String>> getTimetableGr

我有几百个

12-26 10:28:42.383: D/dalvikvm(3341): GC_FOR_ALLOC freed 1122K, 18% free 5834K/7112K, paused 57ms, total 57ms
因为静态方法(它多次递归调用)我调用了数百次。在这个方法中,我有
ArrayList

如何减少内存的使用

方法调用:

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;
}
publicstaticarraylistgettimetablegroupsbytype(stringtypeid)抛出IOException
{
ArrayList timetableItems=新建ArrayList();
Document doc=Jsoup.connect(“https://plan.polsl.pl/left_menu.php?type=“+typeId.get();
元素列表=doc.getElementsByTag(“ul”);
对于(元素列表:列表){
对于(元素项:list.getElementsByTag(“li”)){
HashMap timetableItem=新HashMap();
timetableItem.put(“name”,item.text());
timetableItem.put(“id\u type”,typeId);
如果(!item.id()等于(“”)
{
//Log.d(“ATS4Handler”,item.id());
timetableItem.put(“id”,item.id());
timetableItem.put(“可扩展组”,“true”);
添加(timetableItem);
timetableItems.addAll(getTimeTableItemsByGroups(typeId,item.id());
}
否则{
字符串[]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 link=newhashmap();
while(m.find())
link.put(m.group().split(“=”[0],m.group().split(“=”[1]);
timetableItem.put(“类型ID”,类型ID);
timetableItem.put(“id”),link.get(“id”).toString();
timetableItem.put(“可扩展组”,“false”);
添加(timetableItem);
}
}           
}
返回时间表项目;
}

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

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


然而,内存的最大消耗者可能是从JSoup获得的
文档
对象。理想情况下,您不需要创建一个表示正在解析的整个文档的
文档
对象。不幸的是,JSoup不支持基于事件的解析。

请原谅,但是这段代码有很多问题。1.您可以在本地而不是在类中创建哈希映射,然后重新使用。2.每次调用该方法时,您都在编译一个正则表达式(相同的正则表达式)。3.您正在创建一个新文档,而不是每次都重复使用HTTP连接。4.你正在使用正则表达式解析非常规数据(请不要再引发那场风暴,他已经被关在精神病院好几个月了)等等。你真的应该回到绘图板上,重新设计。整个过程效率极低,而且会消耗内存。谢谢你们的回复。这一切都是原型,我认为当我调用静态方法时,它将在完成所有变量后被销毁。我将把HashMap更改为自己的类,并使文档成为全局的。再次感谢;)timetableItems对象由该方法返回。它的生存期取决于调用方对它所做的操作。那么,除了Jsoup文档,您还有什么建议吗?1)没有。2) 那个问题离题了。