Android无法找到内存泄漏

时间:2018-03-21 12:53:09

标签: android memory-leaks

我正在运行一个后台服务,它正在将数据同步到我的服务器。

此代码中发生泄漏:

                DBCommunicator dataObj = (DBCommunicator) Class.forName(task.getDbObject()).getDeclaredConstructor(cArg).newInstance(context, DBCommunicator.normalDBSettings);
                DBCommunicator oldData = (DBCommunicator) dataObj.getClass().getDeclaredConstructor(cArg).newInstance(context, DBCommunicator.sendNotiDBSettings);
                DBCommunicator newData = (DBCommunicator) dataObj.getClass().getDeclaredConstructor(cArg).newInstance(context, DBCommunicator.sendNotiDBSettings);
                if (dateFrom == null) {
                    dateFrom = "";
                }
                url = CommonFunctions.getWebserviceUrl(context) +
                        task.getUrl() + "&from=" + URLEncoder.encode(dateFrom, "UTF-8") + "&to=" +
                        URLEncoder.encode(dateUntil, "UTF-8");
                GetJSONFromUrl manager = new GetJSONFromUrl();

                ArrayList<?> jsonObject = manager.getJSONfromURL(url);
                //ArrayList<?> jsonObject = null;
                if (jsonObject == null) {
                    throw new Exception("JsonObject is null");
                }

                HashMap<String, String> values;
                for (int i = 0; i < jsonObject.size(); i++) {
                    values = (HashMap<String, String>) jsonObject.get(i);
                    try {


                        if (values.get("Id") == null) {
                            throw new Exception("Parameter Id nicht gesetzt");
                        }

                        oldData.getSingleDataForField("Id", values.get("Id"));
                        if (values.get("Geloescht") != null && values.get("Geloescht").equals("1")) {
                            oldData.deleteData(true);

                        } else {
                            newData.setDataFromRecord(values);
                            if (!oldData.equals(newData)) {
                                oldData.deleteData(true);
                                newData.insertData();
                            }


                        }
                        values = null;
                    } catch (DBDataNotExists e) {
                        if (!(values.get("Geloescht") != null && values.get("Geloescht").equals("1"))) {
                            oldData.setDataFromRecord(values);
                            oldData.insertData();
                        }
                        e = null;

                    }
                    values = null;

                }
                dataObj.clean();
                dataObj.doAfterSync();
                dataObj = null;

                oldData.clean();
                oldData = null;

                newData.clean();
                newData = null;
                manager = null;
                jsonObject = null;
                dataObj = null;

内存分析器说:

  

线程at.stockserv.datasyncer.JobExecutor @ 0x135f6550保留局部变量的总大小为18.603.056(37,90%)字节。   内存累积在由“”加载的“java.lang.Object []”的一个实例中。

     

JobExecutor - &gt; Arraylist - &gt;对象[21079] - &gt;的java.util.HashMap

我不知道这个数量的HashMap或Arraylist来自哪里。

我的JSON对象ArrayList只是迭代通过。我将它设置为null。我不知道这个泄漏可能发生在哪里。

也许有人可以给我一个提示从哪里开始寻找?

1 个答案:

答案 0 :(得分:0)

我在manager.getJSONfromURL(url);

中发现了内存泄漏

我有一个Hashmap和Arraylist填充循环。

现在改变了代码,内存泄漏消失了。