背景
项目中图片拍照功能是调用系统相机,由于某些手机内存不足,经常调用系统相机后,项目app进程被系统杀掉了,所以采取的措施是:调用系统相机前先判断手机可用内存大小,当可用内存低于500M时,提示用户先清理手机内存。
一 获取手机内存大小方法
/**
* Get memory info of device.
*/
@TargetApi(Build.VERSION_CODES.CUPCAKE)
public static ActivityManager.MemoryInfo getMemoryInfo(Context context) {
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo();
am.getMemoryInfo(mi);
return mi;
}
/**
* 内存是否够用
* @param activity
* @return
*/
private boolean memoryIsAvailble(FragmentActivity activity) {
if (activity == null) return true;
ActivityManager.MemoryInfo memoryInfo = MemoryUtil.getMemoryInfo(activity);
if (memoryInfo != null){
double availMem = memoryInfo.availMem * 1.0/ (1024 * 1024);
if (availMem > 0 && availMem <= 500){ // 小于500M
return false;
}
}
return true;
}
//手机总内存大小
double utilTotalMem = MemoryUtil.getMemoryInfo(this).totalMem * 1.0/ (1024 * 1024);
//手机可用内存大小
double utilAvailMem = MemoryUtil.getMemoryInfo(this).availMem * 1.0/ (1024 * 1024);
//临界值,达到这个值,进程就要被杀死,但是我实际测试发现,也并不是根据这个临界值来杀死app的,没啥用
double utilThresholdMem = MemoryUtil.getMemoryInfo(this).threshold * 1.0/ (1024 * 1024);
Log.e("TAGTAGTAG ", "M MemoryUtil.totalMem: "+ utilTotalMem);
Log.e("TAGTAGTAG ", "M MemoryUtil.availMem: "+ utilAvailMem);
Log.e("TAGTAGTAG ", "M MemoryUtil.utilThresholdMem: "+ utilThresholdMem);
(1) 华为HUAWEI nova 7,总内存8G,totalMem=7503M, availMem=2774M
(2) 红米8 Pro,总内存6G,totalMem=5616M,availMem=2212M
(3) 小米4,总内存2G,totalMem=1850M,availMem=522M
经测试:
1 手机可用内存(availMem)一般是总内存(totalMem)的三分之一;
2 该方法获取的总内存大小(totalMem)接近手机总内存,误差很小。
二 获取app内存大小方法
ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
//最大分配内存
int memory = activityManager.getMemoryClass();
System.out.println("memory: "+memory);
//最大分配内存获取方法2
float maxMemory = (float) (Runtime.getRuntime().maxMemory() * 1.0/ (1024 * 1024));
//当前分配的总内存
float totalMemory = (float) (Runtime.getRuntime().totalMemory() * 1.0/ (1024 * 1024));
//剩余内存
float freeMemory = (float) (Runtime.getRuntime().freeMemory() * 1.0/ (1024 * 1024));
Log.e("TAGTAGTAG ", "maxMemory: "+maxMemory);
Log.e("TAGTAGTAG ", "totalMemory: "+totalMemory);
Log.e("TAGTAGTAG ", "freeMemory: "+freeMemory);
经测试:
app占用的总内存(totalMemory)在随着app开启的页面越多,逐渐变大,而不是一开始就分配给应用的最大内存。
三 通过命令行获取内存信息
1 在命令行窗口里输入"adb shell",进入shell环境
2 输入"cat /proc/meminfo" 点回车,即可在命令行里显示meminfo文件的内容
例如:
C:\Users\张志峰>adb shell
begonia:/ $ cat /proc/meminfo
MemTotal: 5751004 kB
MemFree: 181588 kB
MemAvailable: 2308672 kB
Buffers: 83412 kB
Cached: 2108464 kB
SwapCached: 96364 kB
Active: 3123004 kB
Inactive: 1155128 kB
Active(anon): 1531752 kB
Inactive(anon): 561900 kB
Active(file): 1591252 kB
Inactive(file): 593228 kB
Unevictable: 3204 kB
Mlocked: 3204 kB
SwapTotal: 3162168 kB
SwapFree: 2464700 kB
Dirty: 76 kB
Writeback: 0 kB
AnonPages: 2077860 kB
Mapped: 905676 kB
Shmem: 4904 kB
Slab: 285728 kB
SReclaimable: 103352 kB
SUnreclaim: 182376 kB
KernelStack: 78208 kB
PageTables: 91780 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 6037668 kB
Committed_AS: 108909280 kB
VmallocTotal: 263061440 kB
VmallocUsed: 0 kB
VmallocChunk: 0 kB
CmaTotal: 540672 kB
CmaFree: 67704 kB
begonia:/ $
在命令行窗口里输入"adb shell ps"可以获取运行应用列表
C:\Users\张志峰>adb shell ps
USER PID PPID VSZ RSS WCHAN ADDR S NAME
root 1 0 50728 2528 0 0 S
system 1422 475 6555532 171964 0 0 S com.android.systemui
webview_zygote 1448 476 1737288 16712 0 0 S webview_zygote
root 1455 474 10288 2656 0 0 S iptables-restore
root 1467 474 10304 2832 0 0 S ip6tables-restore
radio 1574 475 4388376 69508 0 0 S com.android.phone
u0_a16 1580 475 12313548 195328 0 0 S com.miui.home
root 1884 2 0 0 0 0 I [kbase_event]
radio 1897 475 4287908 37472 0 0 S com.mediatek.ims
root 1959 2 0 0 0 0 I [kbase_event]
system 2119 1 11188 2520 0 0 S charge_logger
system 2121 1 30884 3288 0 0 S mcd
system 2122 1 128964 3264 0 0 S batterywarning
system 2124 1 25752 3212 0 0 S ged_srv
system 2168 475 4244748 32800 0 0 S com.mediatek.voicecommand.vis
system 2183 475 4246228 29732 0 0 S com.goodix.fingerprint
system 2198 475 5502288 28924 0 0 S com.miui.contentcatcher
system 2222 475 4300200 74592 0 0 S com.miui.daemon
nfc 2237 475 4304260 74308 0 0 S com.android.nfc
secure_element 2252 475 4246116 29884 0 0 S com.android.se
u0_a40 2267 475 4714420 127672 0 0 S com.miui.voicetrigger
u0_a17 2282 475 4265540 28520 0 0 S com.xiaomi.mircs
u0_a94 2296 475 4335948 80104 0 0 S com.xiaomi.xmsf
finddevice 2313 475 4312188 59196 0 0 S com.xiaomi.finddevice
system 2330 475 4338224 54484 0 0 S com.mediatek.voicecommand
system 2350 475 4292172 37956 0 0 S com.miui.face
u0_a100 2418 475 4315864 59136 0 0 S com.xiaomi.metoknlp
system 2441 475 4266164 54868 0 0 S com.xiaomi.location.fused
system 2491 475 4427572 81572 0 0 S com.miui.securitycenter.remote
system 3055 27334 16980 4400 0 0 S dumpsys
root 3156 2 0 0 0 0 I [kbase_event]
system 3235 27334 16980 4324 0 0 S dumpsys
system 3327 475 4263940 59364 0 0 S com.xiaomi.joyose
root 4653 2 0 0 0 0 I [kbase_event]
u0_a180 5134 476 2080004 181272 0 0 S com.tencent.mobileqq
u0_a166 5861 475 4265756 37872 0 0 S com.miui.mishare.connectivity
root 6307 2 0 0 0 0 I [kbase_event]
root 6606 2 0 0 0 0 I [kbase_event]
system 7091 27334 16980 4356 0 0 S dumpsys
u0_a71 7105 475 4335412 99784 0 0 S com.miui.hybrid:entrance
u0_a64 7122 475 4275064 126316 0 0 S com.miui.analytics
system 7294 475 4283532 124984 0 0 S com.android.settings:remote
u0_a103 7347 475 4319604 113132 0 0 S com.miui.systemAdSolution
u0_a71 7519 475 4368732 135768 0 0 S com.miui.hybrid
u0_a55 7574 475 4243636 70636 0 0 S com.android.smspush
u0_a46 7590 475 4246592 90200 0 0 S android.ext.services
root 7857 2 0 0 0 0 S [main_thread]
root 7858 2 0 0 0 0 S [hif_thread]
root 7859 2 0 0 0 0 S [rx_thread]
wifi 7860 1 2130656 11196 0 0 S wpa_supplicant
system 8579 27334 16980 4212 0 0 S dumpsys
u0_a47 9202 475 4265584 86084 0 0 S com.lbe.security.miui
system 9379 27334 16980 4068 0 0 S dumpsys
u0_a137 9713 475 4897420 162256 0 0 S com.xiaomi.smarthome
system 9728 475 4266584 36540 0 0 S com.miui.wmsvc
bluetooth 9896 475 4247312 85924 0 0 S com.xiaomi.bluetooth
u0_a137 10298 9713 83512 14992 0 0 S libweexjsb.so
system 10468 475 4261556 34592 0 0 S com.miui.aod
u0_a28 11034 475 4444600 156996 0 0 S com.google.android.packageinstaller
root 11068 2 0 0 0 0 I [kbase_event]
root 11219 2 0 0 0 0 I [fs_suspend_syss]
u0_a180 12210 476 1924300 146116 0 0 S com.tencent.mobileqq:MSF
u0_a78 12548 475 4249844 78968 0 0 S com.unionpay.tsmservice.mi
system 12683 475 4258280 88156 0 0 S com.xiaomi.mi_connect_service
mdnsr 12700 1 5672 1208 0 0 S mdnsd
system 12712 476 1558848 97200 0 0 S com.xiaomi.misettings
u0_a180 14895 476 2239724 126456 0 0 S com.tencent.mobileqq:tool
u0_a180 14964 476 1949940 76008 0 0 S com.tencent.mobileqq:qzone
system 16501 27334 16980 4324 0 0 S dumpsys
theme 16576 475 4993880 93896 0 0 S com.android.thememanager
u0_i49 16652 1448 1548960 27824 0 0 S com.google.android.webview:sandboxed_process0
system 16983 27334 16980 4028 0 0 S dumpsys
root 18447 2 0 0 0 0 I [kworker/u16:2]
system 18530 475 4846756 275692 0 0 S com.android.settings
u0_a153 18778 475 4277428 129924 0 0 S com.miui.weather2
system 18806 27334 16980 3780 0 0 S dumpsys
root 18833 2 0 0 0 0 I [kbase_event]
u0_a61 18847 475 4265696 107184 0 0 S com.xiaomi.account:accountservice
system 18937 27334 16980 4268 0 0 S dumpsys
root 19080 2 0 0 0 0 I [kworker/6:2]
root 19460 2 0 0 0 0 I [kworker/7:2]
u0_a754 20002 475 5131724 317664 0 0 S cn.maitian.app
u0_a754 20038 475 4576740 124156 0 0 S cn.maitian.app:core
root 20112 2 0 0 0 0 I [kbase_event]
u0_a754 20191 475 4582636 135400 0 0 S cn.maitian.app:remote
u0_a171 20881 475 4624224 189620 0 0 S com.netease.nim.demo
system 20901 27334 16980 4328 0 0 S dumpsys
u0_a171 20924 475 4282432 108432 0 0 S com.netease.nim.demo:core
root 20966 2 0 0 0 0 I [kbase_event]
root 20984 2 0 0 0 0 I [kworker/5:2]
u0_a106 21030 475 4248496 91700 0 0 S com.miui.securityinputmethod
root 21074 2 0 0 0 0 I [kworker/u16:5]
u0_a87 21075 475 4323644 140736 0 0 S com.baidu.input_mi
root 21127 2 0 0 0 0 I [kworker/u16:8]
u0_a158 21164 476 2109608 295100 0 0 S com.homelink.android
u0_a158 21182 476 1849204 108956 0 0 S com.homelink.android:coreservice
u0_a158 21399 476 1858580 119956 0 0 S com.homelink.android:remote
root 21429 2 0 0 0 0 I [kbase_event]
root 21495 2 0 0 0 0 I [kworker/6:1]
system 21665 475 4252560 97976 0 0 S com.miui.contentcatcher:autofill
root 21706 2 0 0 0 0 I [kworker/3:1]
u0_a18 21708 475 4427224 124500 0 0 S com.android.camera
u0_i127 21765 1448 1667252 137368 0 0 S com.google.android.webview:sandboxed_process1
shell 21980 21925 11908 4180 0 0 R ps
system 24311 27334 16980 4356 0 0 S dumpsys
u0_a230 25426 475 5187384 124748 0 0 S com.tencent.mm
root 25559 2 0 0 0 0 I [kbase_event]
u0_a230 25677 475 4923124 64220 0 0 S com.tencent.mm:push
system 27334 475 4346676 100620 0 0 S com.miui.powerkeeper
system 27754 27334 16980 4320 0 0 S dumpsys
system 28316 475 4261484 102464 0 0 S com.miui.notification:remote
u0_a15 28318 475 4415604 92064 0 0 S android.process.media
system 29767 27334 16980 4156 0 0 S dumpsys
root 29901 2 0 0 0 0 I [kbase_event]
system 31110 27334 16980 4124 0 0 S dumpsys
system 31486 27334 16980 4352 0 0 S dumpsys
system 32622 27334 16980 4096 0 0 S dumpsys