Android系统的问题分析笔记(1) - 虚拟机heapsize的限制

问题

  在分析 zygote 创建虚拟机的时候,我们说过系统默认设置的 Java 虚拟机堆栈最大为16MB,这个值对于需要使用较大内存的程序(例如图片处理程序)来说远远不够。当然可以修改这个默认值,例如我在Nexus 6P上就将其修改为32MB 了,但这个改动是全局性的,也就是所有的 Java 程序都会是这个 32MB。我们能动态配置这个值吗?
  例如:设置一个配置文件,每个进程启动的时候根据配置文件的参数来设置堆大小。实际上是不行的,zygote 是通过fork 来创建子进程的,Zygote 本身设置的信息会被子进程全部继承。

方案

  1. 为 Dalivk 增加一个函数,这个函数允许动态调整最大堆的大小。
  2. zygote 通过 fork 子进程后,调用 exec 家族的函数来加载另外一个映像,该映像对应的程序会重新创建虚拟机,重新注册JNI函数,也就是模拟 zygote 创世界中前两天的工作,最后调用android.app.ActivityThread 的 main函数。这种方式应该是可行的但难度较大,而且会影响运行速度。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小馬佩德罗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值