当前位置: 首页 > 知识库问答 >
问题:

Android找不到内存泄漏

邢心水
2023-03-14

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

泄漏发生在以下代码中:

                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;

内存分析器显示:

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

JobExecutor->Arraylist->Object[21079]->java.util.HashMap

我不知道这么多的HashMap或Arraylist是从哪里来的。

我的JSON对象ArrayList刚刚迭代过,我将其设置为NULL。

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

共有1个答案

百里默
2023-03-14

我在Manager.getJsonFromurl(url)中发现了内存泄漏

我在循环中填充了一个Hashmap和Arraylist。

更改了那里的代码,现在内存泄漏消失了。

 类似资料:
  • 问题内容: 我认为我的android应用正在泄漏内存。我不是绝对确定这是问题所在。 应用程序打开时经常崩溃,并且logcat尝试加载位图图像时会显示“内存不足”异常。 崩溃后,我重新打开了该应用程序,它运行正常。Logcat会显示许多“ gc”,并且JIT表会不时地向上调整大小,而不会向下调整,直到应用程序因内存不足错误而崩溃。 这听起来像是内存泄漏吗?如果是这样,我该如何定位和关闭泄漏点。 这是

  • 问题内容: 您如何找到Java中的内存泄漏(例如使用JHat)?我试图在JHat中加载堆转储,以进行基本了解。但是,我不明白我应该如何找到根引用(ref)或任何被称为根引用的东西。基本上,我可以说哈希表条目有几百兆字节([java.util.HashMap $ Entry或类似的东西),但是地图到处都是……使用某种方法可以搜索大型地图,还是找到大对象树的一般根? [编辑]好的,到目前为止,我已经阅

  • 我担心从泄漏金丝雀回来的信息。它显示了在UI上声明的所有变量,如片段中的材料按钮、材料卡片视图、文本视图、图像视图等,都导致了内存泄漏。我不知道为什么会这样。

  • 我正在Android应用程序中使用一些本机库,我想在某个时间点从内存中卸载它们。当装入本机库的类的类装入器被垃圾回收时,库被卸载。灵感:本土卸载。 如果ClassLoader用于加载某些类(可能导致内存泄漏),则不会收集垃圾。 本机库只能在应用程序中的一个ClassLoader中加载。如果仍然有旧的ClassLoader挂在内存中的某个地方,并且一个新的ClassLoader试图在某个时间点加载相

  • 我正在使用libgdx制作一个实时壁纸应用程序,根据时间改变资产。对于e、 g从早上6点到下午6点,我有“早上图形”,之后我有“晚上图形”,从下午6点到早上6点。 我构建资产的方式如下 我有12个AtlasRegion类型的静态数组,1个静态纹理区域变量和1个静态纹理变量。 我有两个静态函数load晨()和loadEnight()用于加载资产。 在funcions中,我加载如下 对于所有数组,如果

  • 我在继续我的游戏超过8次后,我得到了OutOfMemory错误,因为堆逐渐填充。在使用MAT分析我的游戏堆时,我知道以下2个原因: 关键词Android.Graphics.Bitmap Byte[] 关键词java.lang.Object[]Android.content.res.resources 请提出解决方案