缩减虚拟机堆空间的方式,缓解32位cpu上虚拟内存地址空间限制导致的内存分配失败崩溃
- 前言
- Matrix
- 使用说明
- 效果验证
前言
瑞芯微平台应用开发,目前RK3288芯片应用还是比较广泛(成本低),它是一个32位cpu,并且线上很多都是2GB Ram板子,导致程序因为内存问题崩溃的比较多。使用了腾讯matrix方案,通过缩减虚拟机堆空间的方式,缓解32位cpu上虚拟内存地址空间限制导致的内存分配失败崩溃。
因为matrix文档写的太粗略了,所以自己记录一下。
Matrix
开源地址
Matrix 是一款微信研发并日常使用的应用性能接入框架,支持iOS, macOS和Android。 Matrix 通过接入各种性能监控方案,对性能监控项的异常数据进行采集和分析,输出相应的问题分析、定位与优化建议,从而帮助开发者开发出更高质量的应用。
功能太多了,我只想进行虚拟机堆空间缩减。
ps:线程创建占用内存缩减我测试发现不生效
使用说明
clone源代码,重点关注matrix-hooks模块中GCSemiSpaceTrimmer类,它的JNI实现主要在cpp目录下memory中,主要原理看以下几篇文章即可
整体方案的一个讲解,官方发布的
对虚拟内存分配机制的一个讲解,能够更好帮助理解实现原理
引用到程序中,按照官方知道依赖一大堆东西太麻烦了,直接根据matrix-hooks模块,发布aar(自己简单改了一下对于日志的依赖)。
最后打包生成两个aar,下载地址如下:
matrix hook aar
matrix backtrace aar
项目中依赖这两个aar,在初始化的地方执行以下代码
//设备版本号小于android8,并且32位操作系统使用此方案(目前来看瑞芯微8.0系统以上主板几乎都是64位,故暂时不是用Patrons方案对8.0以上系统进行处理)
if (!SystemUtils.is64BitRuntime() && Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
if (GCSemiSpaceTrimmer.INSTANCE.isCompatible()) {
GCSemiSpaceTrimmer.INSTANCE.install(0.8f, 60000, null);
}
}
第一个参数是虚拟内存使用超过这个阈值进行虚拟内存释放,第二个参数是循环时间(循环检查是否使用超过阈值)
效果验证
执行 top -m -t | grep
未进行缩减前占用虚拟内存
缩减后占用虚拟内存
可以看到确实是生效了,就这样。