android当内存数据很大的时候,如何能优化内存,提高运行速度

云伊漫天 2014-11-04 09:39:03
开发中遇到这样一个问题:app中需要加载大量的数据,能达到100多m,当用户操作的时候,会调用部分数据,将之显示到我的app中。可是运行的时候发现,我只是调用其中很少量的数据,系统不断地gc,而且运行的速度特别慢,需要十几秒钟,希望大家能帮帮忙。如何优化我的运行速度,对内存更好的管理!
...全文
958 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
andnr003 2014-11-06
  • 打赏
  • 举报
回复
利用软应用,不断加载,不断读取,不断的gc,不仅剩流量,还释放内存
云伊漫天 2014-11-05
  • 打赏
  • 举报
回复
引用 12 楼 zdd2389 的回复:
[quote=引用 10 楼 u014032607 的回复:] [quote=引用 9 楼 zdd2389 的回复:] 做性能优化有很多种方法,最重要的是找出性能的瓶颈在那里。推荐两款工具给你使用。第一个traceview,主要用来查看程序每个方法的耗时时间。第二个,mat工具,分析程序的内存泄露,频繁的gc有可能是内存泄露,导致可用内存越来越少。具体的用法google吧。
工具挺好的,谢谢了,还是不太懂存储数据到内存跟垃圾回收之间矛盾关系,怎么去影响了运行的速度。[/quote] 如果你的程序有内存泄露,依靠垃圾回收机制是无法回收那些内存的,这样就会导致可用内存越来越少,自然运行速度就慢了,最常见的就是bitmap没有释放。另外你的运行速度慢并不一定是因为内存不够用导致的,有可能是一些的方法写的不够简洁,耗时太多,才让程序运行起来很慢。另外真的应该考虑楼下说的是否有必要一次性加载那么多数据到内存中。[/quote] 我这个traceview的文件比较大,然后打开的时候直接,traceview就oom了,如何能设置traceview的内存大小?先谢谢
zdd2389 2014-11-05
  • 打赏
  • 举报
回复
引用 10 楼 u014032607 的回复:
[quote=引用 9 楼 zdd2389 的回复:] 做性能优化有很多种方法,最重要的是找出性能的瓶颈在那里。推荐两款工具给你使用。第一个traceview,主要用来查看程序每个方法的耗时时间。第二个,mat工具,分析程序的内存泄露,频繁的gc有可能是内存泄露,导致可用内存越来越少。具体的用法google吧。
工具挺好的,谢谢了,还是不太懂存储数据到内存跟垃圾回收之间矛盾关系,怎么去影响了运行的速度。[/quote] 如果你的程序有内存泄露,依靠垃圾回收机制是无法回收那些内存的,这样就会导致可用内存越来越少,自然运行速度就慢了,最常见的就是bitmap没有释放。另外你的运行速度慢并不一定是因为内存不够用导致的,有可能是一些的方法写的不够简洁,耗时太多,才让程序运行起来很慢。另外真的应该考虑楼下说的是否有必要一次性加载那么多数据到内存中。
云伊漫天 2014-11-05
  • 打赏
  • 举报
回复
引用 16 楼 DrSmart 的回复:
楼主啊,你java基础不行,看看java编程思想吧,楼上面回复的都得学习啊
恩恩,感谢各位大神帮忙,小弟我会好好学习的!
DrSmart 2014-11-05
  • 打赏
  • 举报
回复
楼主啊,你java基础不行,看看java编程思想吧,楼上面回复的都得学习啊
云伊漫天 2014-11-05
  • 打赏
  • 举报
回复
引用 9 楼 zdd2389 的回复:
做性能优化有很多种方法,最重要的是找出性能的瓶颈在那里。推荐两款工具给你使用。第一个traceview,主要用来查看程序每个方法的耗时时间。第二个,mat工具,分析程序的内存泄露,频繁的gc有可能是内存泄露,导致可用内存越来越少。具体的用法google吧。
traceview这个工具怎么能设置最大时长啊,我最大的知道1.8秒,太短暂了,我需要更长的时间
云伊漫天 2014-11-05
  • 打赏
  • 举报
回复
引用 11 楼 ITbailei 的回复:
[quote=引用 10 楼 u014032607 的回复:] [quote=引用 9 楼 zdd2389 的回复:] 做性能优化有很多种方法,最重要的是找出性能的瓶颈在那里。推荐两款工具给你使用。第一个traceview,主要用来查看程序每个方法的耗时时间。第二个,mat工具,分析程序的内存泄露,频繁的gc有可能是内存泄露,导致可用内存越来越少。具体的用法google吧。
工具挺好的,谢谢了,还是不太懂存储数据到内存跟垃圾回收之间矛盾关系,怎么去影响了运行的速度。[/quote]
引用 3 楼 u014032607 的回复:
[quote=引用 1 楼 birdsaction 的回复:] 我觉得数据很大的时候需要把数据 拆分,比如 只显示 数据的标题和时间,数据其他信息可以 点击后加载, 把一个大数据拆分成2个表存储,或者2次请求显示。 因为你的数据是100M 是挺大的,拆分后显示100M 可能只需要加载50,60M, 系统不断GC,一般是图片较多 或者 字符串太长导致。不知道你的数据内容是什么。你的UI显示结构是怎样的?
内存中加载的100m数据不是要一次显示,只是先存着,然后我每次ui操作的时候,会从这一大堆的数据里面取出2m左右,加载到我的用户界面。按理说:我从内存中取出数据来,即使创建其他对象(如ui控件等)也不会耗时太长,我看了一下调用了20次左右的gc,耗时在20s左右。这简直太疯狂了,时间也多用在我对内存中数据进行处理创建对象的过程[/quote]你理解错了一个概念:“你不用,或者说不显示并不能代表它不存在”,他依然存在内存中,由于android系统的沙盒机制,你这里使用的内存并非是手机总的内存,而是虚拟机分配android应用的内存(默认16M),你必须妥善处理这100M的内存,要么存在本地SD卡上(sqlite数据库中),要么就不要一次性请求这么多数据。[/quote] 是的,应用启动机就需要加载这么大的数据到内存里,速度很慢,之后再操作的过程中会频繁的调用内存中的部分数据的,所以这些数据都是放在内存里面的。
云伊漫天 2014-11-05
  • 打赏
  • 举报
回复
引用 12 楼 zdd2389 的回复:
[quote=引用 10 楼 u014032607 的回复:] [quote=引用 9 楼 zdd2389 的回复:] 做性能优化有很多种方法,最重要的是找出性能的瓶颈在那里。推荐两款工具给你使用。第一个traceview,主要用来查看程序每个方法的耗时时间。第二个,mat工具,分析程序的内存泄露,频繁的gc有可能是内存泄露,导致可用内存越来越少。具体的用法google吧。
工具挺好的,谢谢了,还是不太懂存储数据到内存跟垃圾回收之间矛盾关系,怎么去影响了运行的速度。[/quote] 如果你的程序有内存泄露,依靠垃圾回收机制是无法回收那些内存的,这样就会导致可用内存越来越少,自然运行速度就慢了,最常见的就是bitmap没有释放。另外你的运行速度慢并不一定是因为内存不够用导致的,有可能是一些的方法写的不够简洁,耗时太多,才让程序运行起来很慢。另外真的应该考虑楼下说的是否有必要一次性加载那么多数据到内存中。[/quote] 我的代码里会在循环里创建很多零散的对象,这些垃圾碎片该如何回收,于此同时,我的数据都是保存在hashmap中,而hashmap本身所占用的内存就大,有没有可以替换hashmap而又能实现同样功能的。还有一点疑惑:当内存占用的比较大的时候,如果系统不调用gc,那么会影响应用运行的速度吗?
zdd2389 2014-11-04
  • 打赏
  • 举报
回复
做性能优化有很多种方法,最重要的是找出性能的瓶颈在那里。推荐两款工具给你使用。第一个traceview,主要用来查看程序每个方法的耗时时间。第二个,mat工具,分析程序的内存泄露,频繁的gc有可能是内存泄露,导致可用内存越来越少。具体的用法google吧。
云伊漫天 2014-11-04
  • 打赏
  • 举报
回复
引用 7 楼 birdsaction 的回复:
[quote=引用 6 楼 u014032607 的回复:] [quote=引用 4 楼 birdsaction 的回复:] 2M 到不大,你用内存监控工具监控一下,看看你的内存是那个对象占得比较多, Dump 内存 Tree看看。 
我在加载大数据的时候,可能比较零散,这样垃圾在回收的过程中,就不断地回收垃圾,然后拖慢我运行的速度吗?我感觉加载的东西真的很小,可是还是那么慢[/quote] 具体要看你的代码结构 和加载方式了,不知道你是怎么处理数据的,可能是你其他的代码部分 吃了很多内存 影响了你的数据加载。[/quote] 序列化的过程会不会很吃内存呢?我加载的数据不大,是不是我在处理的过程,需要吃很多内存,我每次gc都会释放好几十兆的内存,
Birds2018 2014-11-04
  • 打赏
  • 举报
回复
引用 6 楼 u014032607 的回复:
[quote=引用 4 楼 birdsaction 的回复:] 2M 到不大,你用内存监控工具监控一下,看看你的内存是那个对象占得比较多, Dump 内存 Tree看看。 
我在加载大数据的时候,可能比较零散,这样垃圾在回收的过程中,就不断地回收垃圾,然后拖慢我运行的速度吗?我感觉加载的东西真的很小,可是还是那么慢[/quote] 具体要看你的代码结构 和加载方式了,不知道你是怎么处理数据的,可能是你其他的代码部分 吃了很多内存 影响了你的数据加载。
云伊漫天 2014-11-04
  • 打赏
  • 举报
回复
引用 4 楼 birdsaction 的回复:
2M 到不大,你用内存监控工具监控一下,看看你的内存是那个对象占得比较多, Dump 内存 Tree看看。 
我在加载大数据的时候,可能比较零散,这样垃圾在回收的过程中,就不断地回收垃圾,然后拖慢我运行的速度吗?我感觉加载的东西真的很小,可是还是那么慢
云伊漫天 2014-11-04
  • 打赏
  • 举报
回复
引用 2 楼 heaimnmn 的回复:
异步加载,分页加载,,,
恩恩,我在将100m的大数据加载的过程中可以这样,我所需要的是在加载完100m后操作的过程中去优化我的运行速度,我加载完数据以后,然后每次操作都要去利用这快内存中的一部分数据(2m左右)去创建我所需要的对象,这个过程频繁的调用gc,约20次,耗时20s左右。对比操作前后:内存增加了约2m左右。
Birds2018 2014-11-04
  • 打赏
  • 举报
回复
2M 到不大,你用内存监控工具监控一下,看看你的内存是那个对象占得比较多, Dump 内存 Tree看看。 
云伊漫天 2014-11-04
  • 打赏
  • 举报
回复
引用 1 楼 birdsaction 的回复:
我觉得数据很大的时候需要把数据 拆分,比如 只显示 数据的标题和时间,数据其他信息可以 点击后加载, 把一个大数据拆分成2个表存储,或者2次请求显示。 因为你的数据是100M 是挺大的,拆分后显示100M 可能只需要加载50,60M, 系统不断GC,一般是图片较多 或者 字符串太长导致。不知道你的数据内容是什么。你的UI显示结构是怎样的?
内存中加载的100m数据不是要一次显示,只是先存着,然后我每次ui操作的时候,会从这一大堆的数据里面取出2m左右,加载到我的用户界面。按理说:我从内存中取出数据来,即使创建其他对象(如ui控件等)也不会耗时太长,我看了一下调用了20次左右的gc,耗时在20s左右。这简直太疯狂了,时间也多用在我对内存中数据进行处理创建对象的过程
哎,真难 2014-11-04
  • 打赏
  • 举报
回复
异步加载,分页加载,,,
Birds2018 2014-11-04
  • 打赏
  • 举报
回复
我觉得数据很大的时候需要把数据 拆分,比如 只显示 数据的标题和时间,数据其他信息可以 点击后加载, 把一个大数据拆分成2个表存储,或者2次请求显示。 因为你的数据是100M 是挺大的,拆分后显示100M 可能只需要加载50,60M, 系统不断GC,一般是图片较多 或者 字符串太长导致。不知道你的数据内容是什么。你的UI显示结构是怎样的?
dali_yan 2014-11-04
  • 打赏
  • 举报
回复
引用 10 楼 u014032607 的回复:
[quote=引用 9 楼 zdd2389 的回复:] 做性能优化有很多种方法,最重要的是找出性能的瓶颈在那里。推荐两款工具给你使用。第一个traceview,主要用来查看程序每个方法的耗时时间。第二个,mat工具,分析程序的内存泄露,频繁的gc有可能是内存泄露,导致可用内存越来越少。具体的用法google吧。
工具挺好的,谢谢了,还是不太懂存储数据到内存跟垃圾回收之间矛盾关系,怎么去影响了运行的速度。[/quote]
引用 3 楼 u014032607 的回复:
[quote=引用 1 楼 birdsaction 的回复:] 我觉得数据很大的时候需要把数据 拆分,比如 只显示 数据的标题和时间,数据其他信息可以 点击后加载, 把一个大数据拆分成2个表存储,或者2次请求显示。 因为你的数据是100M 是挺大的,拆分后显示100M 可能只需要加载50,60M, 系统不断GC,一般是图片较多 或者 字符串太长导致。不知道你的数据内容是什么。你的UI显示结构是怎样的?
内存中加载的100m数据不是要一次显示,只是先存着,然后我每次ui操作的时候,会从这一大堆的数据里面取出2m左右,加载到我的用户界面。按理说:我从内存中取出数据来,即使创建其他对象(如ui控件等)也不会耗时太长,我看了一下调用了20次左右的gc,耗时在20s左右。这简直太疯狂了,时间也多用在我对内存中数据进行处理创建对象的过程[/quote]你理解错了一个概念:“你不用,或者说不显示并不能代表它不存在”,他依然存在内存中,由于android系统的沙盒机制,你这里使用的内存并非是手机总的内存,而是虚拟机分配android应用的内存(默认16M),你必须妥善处理这100M的内存,要么存在本地SD卡上(sqlite数据库中),要么就不要一次性请求这么多数据。
云伊漫天 2014-11-04
  • 打赏
  • 举报
回复
引用 9 楼 zdd2389 的回复:
做性能优化有很多种方法,最重要的是找出性能的瓶颈在那里。推荐两款工具给你使用。第一个traceview,主要用来查看程序每个方法的耗时时间。第二个,mat工具,分析程序的内存泄露,频繁的gc有可能是内存泄露,导致可用内存越来越少。具体的用法google吧。
工具挺好的,谢谢了,还是不太懂存储数据到内存跟垃圾回收之间矛盾关系,怎么去影响了运行的速度。

80,354

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧