将Android应用程序分为两个进程,以便其中一个进程可用于位图操作,以避免出现内存错误
据我所知,我们可以选择为Android应用程序中逻辑上分离的部分分配不同的进程,而据我所知,新进程将为其留出一个新的堆部分 假设我们的应用程序使用了128MB堆中的90-100MB,我们需要使用50mb位图执行操作 没有时间重写、重构和优化代码,因此应用程序使用的内存大大减少 我们是否可以为处理那些重量级位图操作的活动分配不同的进程ID,以避免OutOfMemoryError,如果可能的话,它的缺点是什么 我已经读过了: 但这并不像我的问题那么具体 在这里: 有人提到,这实际上可能会增加RAM占用空间,但他们还没有详细说明 我们可以为处理那些重量级位图操作的活动分配不同的进程ID吗 您可以使用清单中的将Android应用程序分为两个进程,以便其中一个进程可用于位图操作,以避免出现内存错误,android,Android,据我所知,我们可以选择为Android应用程序中逻辑上分离的部分分配不同的进程,而据我所知,新进程将为其留出一个新的堆部分 假设我们的应用程序使用了128MB堆中的90-100MB,我们需要使用50mb位图执行操作 没有时间重写、重构和优化代码,因此应用程序使用的内存大大减少 我们是否可以为处理那些重量级位图操作的活动分配不同的进程ID,以避免OutOfMemoryError,如果可能的话,它的缺点是什么 我已经读过了: 但这并不像我的问题那么具体 在这里: 有人提到,这实际上可能会增加RAM
android:process
属性在单独的进程中运行该活动
所以我们避免了OutOfMemory错误
这不是保证。事实上,鉴于以下引用的声明,这甚至不太可能
假设我们的应用程序使用了128MB堆中的90-100MB
您无法保证获得超过16MB的数据。即使使用android:largeHeap=“true”,您也无法获得比没有该属性时更多的堆空间。不要假设任一进程都必须有50MB的堆空间,除非您控制硬件
如果可能的话,它的缺点是什么
它可能并没有帮助,除非您的第一个进程中并没有需要讨论中的位图。因此,例如,如果您的第一个进程是使用camera
API拍摄相机照片,那么您将在第一个进程中获得整个位图(或者尝试崩溃)。OTOH,如果位图仅在第一个进程中下载,并且您的方式正确(将结果流式传输到文件),那么它可能会帮助解决您的问题
但是,这确实意味着位图处理活动的启动会有点慢,因为它必须从磁盘读取位图,或者根据需要自行下载
活动需要的任何非IPC通信(例如,事件总线、单例缓存)将不存在
进程在后台时被终止以释放系统RAM。在你的情况下,这可能是两个过程中的任何一个。您需要能够处理用户离开您的应用程序(如HOME按钮)并且您的一个或两个进程在此期间被终止的情况。当第二个进程在前台时,您的第一个进程将被终止也不是不可能的——在这个场景中,我没有检查进程重要性值,因为两个进程都属于同一个Android应用程序
而且,如前所述,您无法保证完全干净的进程能够将50MB位图加载到Dalvik/ART堆中
有人提到,这实际上可能会增加RAM占用空间,但他们还没有详细说明
内存占用!=堆空间。RAM footprint指与应用程序关联的系统RAM总量。当两个进程都在运行时,您将使用比只使用一个进程执行相同工作更多的系统RAM。位图处理过程将在活动处于前台时进行,之后的一段时间内,在Android最终终止它以释放系统RAM之前
没有时间重写、重构和优化代码,因此应用程序使用的内存大大减少
除非你控制硬件,否则你真的别无选择。您可以相当确定可以在RAM中处理50MB数据的唯一方法是通过NDK,因为本机分配(malloc()
和friends)来自系统RAM,而不是Dalvik/ART堆,因此不计入该堆限制
我们可以为处理那些重量级位图操作的活动分配不同的进程ID吗
您可以使用清单中的android:process
属性在单独的进程中运行该活动
所以我们避免了OutOfMemory错误
这不是保证。事实上,鉴于以下引用的声明,这甚至不太可能
假设我们的应用程序使用了128MB堆中的90-100MB
您无法保证获得超过16MB的数据。即使使用android:largeHeap=“true”,您也无法获得比没有该属性时更多的堆空间。不要假设任一进程都必须有50MB的堆空间,除非您控制硬件
如果可能的话,它的缺点是什么
它可能并没有帮助,除非您的第一个进程中并没有需要讨论中的位图。因此,例如,如果您的第一个进程是使用camera
API拍摄相机照片,那么您将在第一个进程中获得整个位图(或者尝试崩溃)。OTOH,如果位图仅在第一个进程中下载,并且您的方式正确(将结果流式传输到文件),那么它可能会帮助解决您的问题
但是,这确实意味着位图处理活动的启动会有点慢,因为它必须从磁盘读取位图,或者根据需要自行下载
活动需要的任何非IPC通信(例如,事件总线、单例缓存)将不存在
进程在后台时被终止以释放系统RAM。在你的情况下,这可能是两个过程中的任何一个。你需要能够