- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
背景
在过去的几年里,为了检查你在 Android 上有多少堆内存以及你使用了多少,你可以使用类似的东西:
@JvmStatic
fun getHeapMemStats(context: Context): String {
val runtime = Runtime.getRuntime()
val maxMemInBytes = runtime.maxMemory()
val availableMemInBytes = runtime.maxMemory() - (runtime.totalMemory() - runtime.freeMemory())
val usedMemInBytes = maxMemInBytes - availableMemInBytes
val usedMemInPercentage = usedMemInBytes * 100 / maxMemInBytes
return "used: " + Formatter.formatShortFileSize(context, usedMemInBytes) + " / " +
Formatter.formatShortFileSize(context, maxMemInBytes) + " (" + usedMemInPercentage + "%)"
}
val list = ArrayList<Bitmap>()
Log.d("AppLog", "memStats:" + MemHelper.getHeapMemStats(this))
useMoreMemoryButton.setOnClickListener {
AsyncTask.execute {
for (i in 0..1000) {
// list.add(Bitmap.createBitmap(20000, 20000, Bitmap.Config.ARGB_8888))
list.add(BitmapFactory.decodeResource(resources, R.drawable.huge_image))
Log.d("AppLog", "heapMemStats:" + MemHelper.getHeapMemStats(this) + " nativeMemStats:" + MemHelper.getNativeMemStats(this))
}
}
}
@JvmStatic
fun getNativeMemStats(context: Context): String {
val nativeHeapSize = Debug.getNativeHeapSize()
val nativeHeapFreeSize = Debug.getNativeHeapFreeSize()
val usedMemInBytes = nativeHeapSize - nativeHeapFreeSize
val usedMemInPercentage = usedMemInBytes * 100 / nativeHeapSize
return "used: " + Formatter.formatShortFileSize(context, usedMemInBytes) + " / " +
Formatter.formatShortFileSize(context, nativeHeapSize) + " (" + usedMemInPercentage + "%)"
}
heapMemStats:used: 2.0 MB / 201 MB (0%) nativeMemStats:used: 3.6 MB / 6.3 MB (57%)
heapMemStats:used: 1.8 MB / 201 MB (0%) nativeMemStats:used: 290 MB / 310 MB (93%)
heapMemStats:used: 1.8 MB / 201 MB (0%) nativeMemStats:used: 553 MB / 579 MB (95%)
heapMemStats:used: 1.8 MB / 201 MB (0%) nativeMemStats:used: 821 MB / 847 MB (96%)
01-04 10:12:36.936 30598-31301/com.example.user.myapplication E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1 Process: com.example.user.myapplication, PID: 30598 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.graphics.Bitmap.setHasAlpha(boolean)' on a null object reference at android.graphics.Bitmap.createBitmap(Bitmap.java:1046) at android.graphics.Bitmap.createBitmap(Bitmap.java:980) at android.graphics.Bitmap.createBitmap(Bitmap.java:930) at android.graphics.Bitmap.createBitmap(Bitmap.java:891) at com.example.user.myapplication.MainActivity$onCreate$1$1.run(MainActivity.kt:21) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) at java.lang.Thread.run(Thread.java:764)
最佳答案
看起来您的应用程序被 Linux OOM 杀手杀死了。积极使用 native 内存的游戏开发人员和其他人一直看到这种情况发生。
启用内核过量使用以及解除对位图分配的基于堆的限制可能会导致您看到的图片。您可以阅读一些关于过量使用的内容 here .
就我个人而言,我很想看到一个用于了解应用程序死亡的操作系统 API,但我不会屏住呼吸。
- What's the correct way to get the max native memory that app is allowed to use, and print it on logs, and use it as something to decide of max ?
onTrimMemory
(这与OOM杀手和 native 内存压力直接相关),尽量减少你的消耗。
- I guess this new behavior might affect some caching libraries, right? That's because they might depend on the heap memory size instead.
- How could it be that I could create so many bitmaps, each of size 20,000x20,000
How could the native memory functions return me such huge values in the case of bitmap creation, yet more reasonably ones for when I decoded bitmaps ? What do they mean?
What's with the weird profiler graph on the Bitmap creation case? It barely rises in memory usage, and yet it reached a point that it can't create any more of them, eventually (after a lot of items being inserted).
Also, as opposed to when I decode bitmaps, I do get a crash here (including a dialog), but it's not OOM. Instead, it's... NPE !
- ...Can Crashlytics detect it? Is there a way to be informed of such a thing, whether by users or during development at the office?
malloc
来检测内存分配。功能(例如,通过热修补应用程序导入表或类似的东西)。
关于android - 位图分配如何在奥利奥上工作,以及如何调查它们的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48091403/
我创建了一项服务,可以在设备移动时跟踪其位置。该服务由与其绑定(bind)的 Activity 启动,在该 Activity 中有一个“Start Tracking”按钮。按下此按钮时,我需要服务在前
在 oreo 中如何启用通知 LED 闪烁而没有通知声音,如果我禁用通知声音 LED 不闪烁 Notification notification = new NotificationCompat.
我将 NotificationCompat.Builder 设置为: .setSound(getNotificationSound(), AudioManager.STREAM_ALARM) .set
我正在 Oreo AOSP 中开发一个简单的系统应用程序,以使用预定义的 SSID 和预共享 key 打开 wifi 热点。 因为我的应用程序是作为系统应用程序构建的,所以我不需要反射。 主 Acti
我正在开发一个物联网应用程序,其中有一个登录流程,用户连接到一个没有互联网连接的接入点,配置设备,然后连接到他的家庭 Wifi 网络。 Android 8 设备导致了一些问题,与接入点断开连接并重新连
根据 "developer.android.com" If the app targets Android 8.0 (API level 26), the system grants only REA
针对 Android O 的应用程序在使用服务时有一些新规则,其中之一是我们不能在应用程序处于后台时启动服务。 成为默认 SMS 应用程序的要求之一是:(来自 Telephony.java javad
作为测试,我从我们拥有的工作服务中删除了“startForeground(通知)”,它似乎仍在工作。 我们是否不需要在 Android O 及更高版本上发布工作服务的前台通知? 我无法找到这方面的具体
每当用户调用新电话时,我都试图在我的应用程序上触发通知。我在我的 Activity 中注册接收器并在 onDestroy() 方法中销毁它。以下是注册的代码 fragment registerRece
当应用程序位于前台时,我正在尝试使用 firebase 显示通知。当我从服务器推送通知时调用了 onMessageReceived 方法,但是通知没有显示。 这里是我的代码: public class
我正在尝试从相机 Intent 获取图像。它运行良好,但仅限于我的设备(oreo/8.1.0)。我生成未签名的 apk 并尝试在其他设备(pie 和 lolipop)中运行,但它不起作用。 我搜索了
我需要为我的应用程序中的所有屏幕禁用 Activity 过渡动画。以前的解决方案适用于所有 Android 版本: @null ...但对于 Android 8“Oreo”,每次转换(向前
我有一个相对简单的设置,应该在一天中的特定时间触发警报并向用户显示通知。这是相关代码, 设置闹钟 long inTime = /*expirationTime*/ Calendar.getInsta
https://android-developers.googleblog.com/2017/07/seccomp-filter-in-android-o.html 正如本文的“seccomp 过滤器
我在 google play 商店收到这条消息 - 这是这个应用程序的 list - Gradle 配置- defaultConfig { minSdkVersion 16
我有一个监视 wifi 连接的小部件,因此我启动了一个服务来启动广播接收器来检测网络变化。一切正常,除非我退出主应用程序:服务停止。 因此,我在小部件中启动了一个警报管理器,该管理器大约每分钟唤醒一次
我的代码: mNotifyBuilder.setSmallIcon(R.drawable.ic_status_bar) .setContentTitle("")
我的应用在 Google Play 上似乎存在某些 Android 8.0 设备的特定错误。 不幸的是,到目前为止我还无法自己复制该错误。 这是错误日志: android.content.res.Re
根据background execution limits在 Android Oreo 中引入,调用 startService当应用程序在后台时应该抛出一个 IllegalArgumentExcept
我目前正在使用 android api 级别 26(Nexus 6P)中可用的电话管理器(USSD 响应)。对于单步 ussd session ,它正在运行。 引用: http://codedrago
我是一名优秀的程序员,十分优秀!