我觉得数据很大的时候需要把数据 拆分,比如 只显示 数据的标题和时间,数据其他信息可以 点击后加载,
把一个大数据拆分成2个表存储,或者2次请求显示。
因为你的数据是100M 是挺大的,拆分后显示100M 可能只需要加载50,60M,
系统不断GC,一般是图片较多 或者 字符串太长导致。不知道你的数据内容是什么。你的UI显示结构是怎样的?

解决方案 »

  1.   


    内存中加载的100m数据不是要一次显示,只是先存着,然后我每次ui操作的时候,会从这一大堆的数据里面取出2m左右,加载到我的用户界面。按理说:我从内存中取出数据来,即使创建其他对象(如ui控件等)也不会耗时太长,我看了一下调用了20次左右的gc,耗时在20s左右。这简直太疯狂了,时间也多用在我对内存中数据进行处理创建对象的过程
      

  2.   

    2M 到不大,你用内存监控工具监控一下,看看你的内存是那个对象占得比较多,
    Dump 内存 Tree看看。 
      

  3.   


    恩恩,我在将100m的大数据加载的过程中可以这样,我所需要的是在加载完100m后操作的过程中去优化我的运行速度,我加载完数据以后,然后每次操作都要去利用这快内存中的一部分数据(2m左右)去创建我所需要的对象,这个过程频繁的调用gc,约20次,耗时20s左右。对比操作前后:内存增加了约2m左右。
      

  4.   

    做性能优化有很多种方法,最重要的是找出性能的瓶颈在那里。推荐两款工具给你使用。第一个traceview,主要用来查看程序每个方法的耗时时间。第二个,mat工具,分析程序的内存泄露,频繁的gc有可能是内存泄露,导致可用内存越来越少。具体的用法google吧。
      

  5.   


    工具挺好的,谢谢了,还是不太懂存储数据到内存跟垃圾回收之间矛盾关系,怎么去影响了运行的速度。
    内存中加载的100m数据不是要一次显示,只是先存着,然后我每次ui操作的时候,会从这一大堆的数据里面取出2m左右,加载到我的用户界面。按理说:我从内存中取出数据来,即使创建其他对象(如ui控件等)也不会耗时太长,我看了一下调用了20次左右的gc,耗时在20s左右。这简直太疯狂了,时间也多用在我对内存中数据进行处理创建对象的过程你理解错了一个概念:“你不用,或者说不显示并不能代表它不存在”,他依然存在内存中,由于android系统的沙盒机制,你这里使用的内存并非是手机总的内存,而是虚拟机分配android应用的内存(默认16M),你必须妥善处理这100M的内存,要么存在本地SD卡上(sqlite数据库中),要么就不要一次性请求这么多数据。
      

  6.   


    工具挺好的,谢谢了,还是不太懂存储数据到内存跟垃圾回收之间矛盾关系,怎么去影响了运行的速度。
    如果你的程序有内存泄露,依靠垃圾回收机制是无法回收那些内存的,这样就会导致可用内存越来越少,自然运行速度就慢了,最常见的就是bitmap没有释放。另外你的运行速度慢并不一定是因为内存不够用导致的,有可能是一些的方法写的不够简洁,耗时太多,才让程序运行起来很慢。另外真的应该考虑楼下说的是否有必要一次性加载那么多数据到内存中。
      

  7.   


    工具挺好的,谢谢了,还是不太懂存储数据到内存跟垃圾回收之间矛盾关系,怎么去影响了运行的速度。
    如果你的程序有内存泄露,依靠垃圾回收机制是无法回收那些内存的,这样就会导致可用内存越来越少,自然运行速度就慢了,最常见的就是bitmap没有释放。另外你的运行速度慢并不一定是因为内存不够用导致的,有可能是一些的方法写的不够简洁,耗时太多,才让程序运行起来很慢。另外真的应该考虑楼下说的是否有必要一次性加载那么多数据到内存中。我的代码里会在循环里创建很多零散的对象,这些垃圾碎片该如何回收,于此同时,我的数据都是保存在hashmap中,而hashmap本身所占用的内存就大,有没有可以替换hashmap而又能实现同样功能的。还有一点疑惑:当内存占用的比较大的时候,如果系统不调用gc,那么会影响应用运行的速度吗?
      

  8.   


    工具挺好的,谢谢了,还是不太懂存储数据到内存跟垃圾回收之间矛盾关系,怎么去影响了运行的速度。
    内存中加载的100m数据不是要一次显示,只是先存着,然后我每次ui操作的时候,会从这一大堆的数据里面取出2m左右,加载到我的用户界面。按理说:我从内存中取出数据来,即使创建其他对象(如ui控件等)也不会耗时太长,我看了一下调用了20次左右的gc,耗时在20s左右。这简直太疯狂了,时间也多用在我对内存中数据进行处理创建对象的过程你理解错了一个概念:“你不用,或者说不显示并不能代表它不存在”,他依然存在内存中,由于android系统的沙盒机制,你这里使用的内存并非是手机总的内存,而是虚拟机分配android应用的内存(默认16M),你必须妥善处理这100M的内存,要么存在本地SD卡上(sqlite数据库中),要么就不要一次性请求这么多数据。是的,应用启动机就需要加载这么大的数据到内存里,速度很慢,之后再操作的过程中会频繁的调用内存中的部分数据的,所以这些数据都是放在内存里面的。
      

  9.   


    traceview这个工具怎么能设置最大时长啊,我最大的知道1.8秒,太短暂了,我需要更长的时间
      

  10.   

    楼主啊,你java基础不行,看看java编程思想吧,楼上面回复的都得学习啊
      

  11.   


    工具挺好的,谢谢了,还是不太懂存储数据到内存跟垃圾回收之间矛盾关系,怎么去影响了运行的速度。
    如果你的程序有内存泄露,依靠垃圾回收机制是无法回收那些内存的,这样就会导致可用内存越来越少,自然运行速度就慢了,最常见的就是bitmap没有释放。另外你的运行速度慢并不一定是因为内存不够用导致的,有可能是一些的方法写的不够简洁,耗时太多,才让程序运行起来很慢。另外真的应该考虑楼下说的是否有必要一次性加载那么多数据到内存中。我这个traceview的文件比较大,然后打开的时候直接,traceview就oom了,如何能设置traceview的内存大小?先谢谢