android内存管理,垃圾回收策略的疑惑

云伊漫天 2014-11-03 10:17:41
加精
本人开发的应用需要加载大量的数据到内存,加载的过程中系统频繁的调用gc进行垃圾回收,由于使用的heap比较大,每次gc的耗时都比较长,我如何能修改降低gc的频率,从而优化我的运行速度呢。有人说通过对dalvikvm的参数进行设置,dalvik.vm.heapminfree,dalvik.vm.heapmaxfree这些参数又代表了什么,该如何在应用中去修改这些参数呢?系统版本4.0以上。
谢谢高手指导!
...全文
1735 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sam083 2014-11-11
  • 打赏
  • 举报
回复
学习了,赞.....大神真多吖。
qq_23162879 2014-11-10
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
mylajitong 2014-11-05
  • 打赏
  • 举报
回复
qingchange 2014-11-05
  • 打赏
  • 举报
回复
引用 4 楼 u014032607 的回复:
[quote=引用 1 楼 hjq2013 的回复:] 不懂,绑定!!!!!!
啊,绑定什么东东啊,这个我不清楚呀,还请赐教呀[/quote]应该就是bundle吧
cattpon 2014-11-04
  • 打赏
  • 举报
回复
不懂~静观解决~
svenwang 2014-11-04
  • 打赏
  • 举报
回复
引用 17 楼 u014032607 的回复:
[quote=引用 15 楼 svenwang 的回复:] 我觉得还得从app怎么样使用内存来着手解决这个问题。 思路无非就是时间换空间。
目前遇到的问题就是:由于内存使用的太大,内存里面保存了大量我所需要的数据,当堆达到100多m的时候,只是继续加载几兆数据都耗时特别长 [/quote] 这个和具体需求有关。你能不能解释一下你的需求? 我觉得类似需求的程序,都有替代方法解决。我前一阵写过一个程序是要给非常多的数据做排序,在内存里完全装不下。
云伊漫天 2014-11-04
  • 打赏
  • 举报
回复
引用 15 楼 svenwang 的回复:
我觉得还得从app怎么样使用内存来着手解决这个问题。 思路无非就是时间换空间。
目前遇到的问题就是:由于内存使用的太大,内存里面保存了大量我所需要的数据,当堆达到100多m的时候,只是继续加载几兆数据都耗时特别长
云伊漫天 2014-11-04
  • 打赏
  • 举报
回复
引用 22 楼 svenwang 的回复:
[quote=引用 21 楼 svenwang 的回复:] [quote=引用 20 楼 u014032607 的回复:] [quote=引用 18 楼 svenwang 的回复:] [quote=引用 17 楼 u014032607 的回复:] [quote=引用 15 楼 svenwang 的回复:] 我觉得还得从app怎么样使用内存来着手解决这个问题。 思路无非就是时间换空间。
目前遇到的问题就是:由于内存使用的太大,内存里面保存了大量我所需要的数据,当堆达到100多m的时候,只是继续加载几兆数据都耗时特别长 [/quote] 这个和具体需求有关。你能不能解释一下你的需求? 我觉得类似需求的程序,都有替代方法解决。我前一阵写过一个程序是要给非常多的数据做排序,在内存里完全装不下。 [/quote] 我的程序需要先加载很大的xml文件。x数据加载完以后大概有100多兆了,然后在应用中做操作的时候,就会去调用部分数据(1m到2m左右)将数据填充到我创建的对象里面进而显示出来。操作的时候gc20多次,耗时20s左右有效。不知道该如何优化[/quote] 是用sax解析吗?如果是dom解析可以换成sax。 我不知道你加载的数据的使用方式,但是可以考虑把部分数据换出到文件上(类似OS的内存页面换出机制)。 [/quote] 本质上还是你业务逻辑的算法设计问题,怎么样去分解问题域,怎么样分而治之。[/quote] 我也想换解析方式,可是那些处理逻辑已经封装在公司的框架里面了,我所能处理的就是调用公司框架,在那么大的内存状况下,如何能运行起来流畅
a_tuzi 2014-11-04
  • 打赏
  • 举报
回复
xml解析完成之后你可以转移到数据库处理啊
svenwang 2014-11-04
  • 打赏
  • 举报
回复
引用 21 楼 svenwang 的回复:
[quote=引用 20 楼 u014032607 的回复:] [quote=引用 18 楼 svenwang 的回复:] [quote=引用 17 楼 u014032607 的回复:] [quote=引用 15 楼 svenwang 的回复:] 我觉得还得从app怎么样使用内存来着手解决这个问题。 思路无非就是时间换空间。
目前遇到的问题就是:由于内存使用的太大,内存里面保存了大量我所需要的数据,当堆达到100多m的时候,只是继续加载几兆数据都耗时特别长 [/quote] 这个和具体需求有关。你能不能解释一下你的需求? 我觉得类似需求的程序,都有替代方法解决。我前一阵写过一个程序是要给非常多的数据做排序,在内存里完全装不下。 [/quote] 我的程序需要先加载很大的xml文件。x数据加载完以后大概有100多兆了,然后在应用中做操作的时候,就会去调用部分数据(1m到2m左右)将数据填充到我创建的对象里面进而显示出来。操作的时候gc20多次,耗时20s左右有效。不知道该如何优化[/quote] 是用sax解析吗?如果是dom解析可以换成sax。 我不知道你加载的数据的使用方式,但是可以考虑把部分数据换出到文件上(类似OS的内存页面换出机制)。 [/quote] 本质上还是你业务逻辑的算法设计问题,怎么样去分解问题域,怎么样分而治之。
svenwang 2014-11-04
  • 打赏
  • 举报
回复
引用 20 楼 u014032607 的回复:
[quote=引用 18 楼 svenwang 的回复:] [quote=引用 17 楼 u014032607 的回复:] [quote=引用 15 楼 svenwang 的回复:] 我觉得还得从app怎么样使用内存来着手解决这个问题。 思路无非就是时间换空间。
目前遇到的问题就是:由于内存使用的太大,内存里面保存了大量我所需要的数据,当堆达到100多m的时候,只是继续加载几兆数据都耗时特别长 [/quote] 这个和具体需求有关。你能不能解释一下你的需求? 我觉得类似需求的程序,都有替代方法解决。我前一阵写过一个程序是要给非常多的数据做排序,在内存里完全装不下。 [/quote] 我的程序需要先加载很大的xml文件。x数据加载完以后大概有100多兆了,然后在应用中做操作的时候,就会去调用部分数据(1m到2m左右)将数据填充到我创建的对象里面进而显示出来。操作的时候gc20多次,耗时20s左右有效。不知道该如何优化[/quote] 是用sax解析吗?如果是dom解析可以换成sax。 我不知道你加载的数据的使用方式,但是可以考虑把部分数据换出到文件上(类似OS的内存页面换出机制)。
云伊漫天 2014-11-04
  • 打赏
  • 举报
回复
引用 18 楼 svenwang 的回复:
[quote=引用 17 楼 u014032607 的回复:] [quote=引用 15 楼 svenwang 的回复:] 我觉得还得从app怎么样使用内存来着手解决这个问题。 思路无非就是时间换空间。
目前遇到的问题就是:由于内存使用的太大,内存里面保存了大量我所需要的数据,当堆达到100多m的时候,只是继续加载几兆数据都耗时特别长 [/quote] 这个和具体需求有关。你能不能解释一下你的需求? 我觉得类似需求的程序,都有替代方法解决。我前一阵写过一个程序是要给非常多的数据做排序,在内存里完全装不下。 [/quote] 我的程序需要先加载很大的xml文件。x数据加载完以后大概有100多兆了,然后在应用中做操作的时候,就会去调用部分数据(1m到2m左右)将数据填充到我创建的对象里面进而显示出来。操作的时候gc20多次,耗时20s左右有效。不知道该如何优化
云伊漫天 2014-11-03
  • 打赏
  • 举报
回复
引用 5 楼 YKDSea 的回复:
[quote=引用 3 楼 u014032607 的回复:] [quote=引用 2 楼 YKDSea 的回复:] 我之前处理过heap的bug,对配置的Prop研究过,看下http://blog.csdn.net/ykdsea/article/details/38519511 但是你是写一个app是没有办法修改这写prop的,如果你的数据特别零碎,最好自己做内存管理。
比较纳闷的是android中有个隐藏的vmRuntime,通过反射可以设置内存的利用率,却不能设置heapminfree等。那内存管理怎么做的呢,这个我不太懂呢[/quote] Runtime应该用处不大了,因为不少prop是启动的时候就已经使用了,重新设置已经没有用了。而且对于你的case来说,是内存占用比较大,修改这些prop并不能改变这个事实的。 我是建议把对象放到native去管理。[/quote] 恩恩,是很大的内存,能达到一百多兆,放到native如何管理,能给个方向吗?这一块没有接触过,就没有办法在应用层设置gc策略的吗?减少gc次数,我看有个systemproperties应该存储了系统prop中的参数,android每个应用都会开启一个dalvik,按理来说应用本身可以对dalvik进行特殊的设置的呀,真的谢谢你了
sky-Z 2014-11-03
  • 打赏
  • 举报
回复
引用 3 楼 u014032607 的回复:
[quote=引用 2 楼 YKDSea 的回复:] 我之前处理过heap的bug,对配置的Prop研究过,看下http://blog.csdn.net/ykdsea/article/details/38519511 但是你是写一个app是没有办法修改这写prop的,如果你的数据特别零碎,最好自己做内存管理。
比较纳闷的是android中有个隐藏的vmRuntime,通过反射可以设置内存的利用率,却不能设置heapminfree等。那内存管理怎么做的呢,这个我不太懂呢[/quote] Runtime应该用处不大了,因为不少prop是启动的时候就已经使用了,重新设置已经没有用了。而且对于你的case来说,是内存占用比较大,修改这些prop并不能改变这个事实的。 我是建议把对象放到native去管理。
云伊漫天 2014-11-03
  • 打赏
  • 举报
回复
引用 1 楼 hjq2013 的回复:
不懂,绑定!!!!!!
啊,绑定什么东东啊,这个我不清楚呀,还请赐教呀
云伊漫天 2014-11-03
  • 打赏
  • 举报
回复
引用 2 楼 YKDSea 的回复:
我之前处理过heap的bug,对配置的Prop研究过,看下http://blog.csdn.net/ykdsea/article/details/38519511 但是你是写一个app是没有办法修改这写prop的,如果你的数据特别零碎,最好自己做内存管理。
比较纳闷的是android中有个隐藏的vmRuntime,通过反射可以设置内存的利用率,却不能设置heapminfree等。那内存管理怎么做的呢,这个我不太懂呢
sky-Z 2014-11-03
  • 打赏
  • 举报
回复
我之前处理过heap的bug,对配置的Prop研究过,看下http://blog.csdn.net/ykdsea/article/details/38519511 但是你是写一个app是没有办法修改这写prop的,如果你的数据特别零碎,最好自己做内存管理。
Hare_ 2014-11-03
  • 打赏
  • 举报
回复
不懂,绑定!!!!!!
  • 打赏
  • 举报
回复
引用 14 楼 u014032607 的回复:
[quote=引用 13 楼 blackchen2004 的回复:] [quote=引用 9 楼 u014032607 的回复:] [quote=引用 8 楼 blackchen2004 的回复:] 第一:增加申请内存大小: android:largeHeap="true" 第二:分散内存, 将你的应用分散在多个进程里面。 dalvik.vm.heapminfree,dalvik.vm.heapmaxfree这些属性属于静态系统属性,运行时修改是没有用的。
引用 8 楼 blackchen2004 的回复:
第一:增加申请内存大小: android:largeHeap="true" 第二:分散内存, 将你的应用分散在多个进程里面。 dalvik.vm.heapminfree,dalvik.vm.heapmaxfree这些属性属于静态系统属性,运行时修改是没有用的。
增加申请内存我知道,可是这个分散内存具体怎么进行啊,也没有找到相关可实施的具体做法,还希望你解惑,谢谢你[/quote] 因为内存是以进程为分配单位的, 每个进程的可分配内存是独立计算的, 所以分散内存的意思就是分散到不同进程中。 在Androidmanifest里面,如果比较独立的模块,配置android:process属性。 [/quote] 那是不是两个进程之间就不能相互的访问数据了呢,彼此都独立了,[/quote] 是的, 不过还是可以通过service,provider等方式来相互访问。
加载更多回复(9)

80,429

社区成员

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

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