我正在运行一个后台服务,它正在将数据同步到我的服务器。
此代码中发生泄漏:
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。我不知道这个泄漏可能发生在哪里。
也许有人可以给我一个提示从哪里开始寻找?
答案 0 :(得分:0)
我在manager.getJSONfromURL(url);
中发现了内存泄漏我有一个Hashmap和Arraylist填充循环。
现在改变了代码,内存泄漏消失了。