编写了一个图形游戏程序。当我在模拟器和智能手机上编写测试时。一切正常。然后,他决定在另一部智能手机上进行尝试-该程序在很短的时间后就退出了。引发错误-java.lang.OutOfMemoryError: Failed to allocate a 576012 byte allocation with 45728 free bytes and 44KB until OOM
使用AndroidStudio中的事件探查器查看了已用内存的大小。
对于程序正常运行的智能手机,我得到了以下结果(可用RAM-750MB,版本android 7.1.1):
Total - 115MB; Java - 74MB; Native - 5,8MB; Graphics - 7,6MB; Stack - 0,6MB; Code - 21,5 MB; Others - 5MB.
除Java之外,所有值都是常量。此参数增长到大约-90MB。然后,垃圾收集器将删除所有不必要的内容,然后将参数(Java)再次降低为初始值。
在另一部智能手机上,一切也都正常运行(可用RAM-500MB,Android版本-10):
Total - 161MB; Java - 13MB; Native - 100MB; Graphics - 9MB; Stack - 0,6MB; Code - 34 MB; Others - 7MB.
在这种情况下,只有本机参数从60变为100MB
在第3部智能手机上,游戏1-2分钟后程序崩溃。来自探查器的数据:
Total - 166MB; Java - 81MB; Native - 11MB; Graphics - 35MB; Stack - 0,6MB; Code - 29 MB; Others - 5MB.
在这种情况下,只有Java参数从70更改为80MB(大约)引发错误-java.lang.OutOfMemoryError:未能分配576012字节的分配,其中包含45728个可用字节和44KB,直到OOM(可用RAM-400MB,Android版本- 7.0)我注意到第3个智能手机更强烈地加载Graphics参数,具有更少的可用RAM,而android版本是7.0。我不知道这是否会影响错误的外观。
告诉我可能是什么问题?
我发布了LOG文件的一个片段:
2021-02-26 12:51:22,824 [6294715] INFO - ools.idea.run.tasks.DeployTask - Installing application: com.medinq.superlines
2021-02-26 12:51:23,291 [6295182] INFO - a.run.tasks.AbstractDeployTask - 284363961ms TRC_BEG [22751][22751] : installer
2021-02-26 12:51:23,291 [6295182] INFO - a.run.tasks.AbstractDeployTask - 284363965ms TRC_BEG [22751][22751] : Command Dump
2021-02-26 12:51:23,291 [6295182] INFO - a.run.tasks.AbstractDeployTask - 284363966ms TRC_BEG [22751][22751] : get process ids
2021-02-26 12:51:23,292 [6295183] INFO - a.run.tasks.AbstractDeployTask - 284364116ms LOG_ERR [22751][22751] : Could not get package user id: run-as: Could not set capabilities: Operation not permitted
2021-02-26 12:51:23,292 [6295183] INFO - a.run.tasks.AbstractDeployTask - 284364117ms TRC_END [22751][22751] :
2021-02-26 12:51:23,292 [6295183] INFO - a.run.tasks.AbstractDeployTask - 284364117ms TRC_BEG [22751][22751] : CmdCommand::GetApksFromDump
2021-02-26 12:51:23,292 [6295183] INFO - a.run.tasks.AbstractDeployTask - 284364222ms TRC_END [22751][22751] :
2021-02-26 12:51:23,292 [6295183] INFO - a.run.tasks.AbstractDeployTask - 284364222ms TRC_BEG [22751][22751] : processing APK
2021-02-26 12:51:23,292 [6295183] INFO - a.run.tasks.AbstractDeployTask - 284364222ms TRC_END [22751][22751] :
2021-02-26 12:51:23,292 [6295183] INFO - a.run.tasks.AbstractDeployTask - 284364222ms TRC_END [22751][22751] :
2021-02-26 12:51:23,292 [6295183] INFO - a.run.tasks.AbstractDeployTask - 284364222ms TRC_END [22751][22751] :
2021-02-26 12:51:25,216 [6297107] INFO - a.run.tasks.AbstractDeployTask - Install successfully finished in 2 s 382 ms.. App restart successful without requiring a re-install.
2021-02-26 12:51:26,834 [6298725] INFO - run.AndroidLogcatOutputCapture - startCapture("samsung-sm_a510f-3300376233021439")
2021-02-26 12:52:04,874 [6336765] INFO - run.AndroidLogcatOutputCapture - stopCapture("samsung-sm_a510f-3300376233021439")
2021-02-26 12:52:04,874 [6336765] INFO - run.AndroidLogcatOutputCapture - stopAll()
2021-02-26 12:52:19,115 [6351006] INFO - j.ide.actions.RevealFileAction - Exit code 1
2021-02-26 12:52:19,645 [6351536] INFO - rationStore.ComponentStoreImpl - Saving appRegistry took 16 ms
2021-02-26 12:54:04,487 [6456378] INFO - ild.invoker.GradleBuildInvoker - About to execute Gradle tasks: [:app:assembleDebug]
2021-02-26 12:54:04,503 [6456394] INFO - s.plugins.gradle.GradleManager - Instructing gradle to use java from C:/Program Files/Android/Android Studio/jre
2021-02-26 12:54:04,519 [6456410] INFO - ild.invoker.GradleBuildInvoker - Build command line options: [-Pandroid.injected.invoked.from.ide=true, -Pandroid.injected.studio.version=10.4.1.1, -Pandroid.injected.attribution.file.location=C:\Users\Ura\AppData\Local\Temp\1614333244503-0, -Pandroid.injected.build.api=24, -Pandroid.injected.build.density=xxhdpi, -Pandroid.injected.build.abi=armeabi-v7a,armeabi]
2021-02-26 12:54:04,519 [6456410] INFO - xecution.GradleExecutionHelper - Passing command-line args to Gradle Tooling API: -Pandroid.injected.invoked.from.ide=true -Pandroid.injected.studio.version=10.4.1.1 -Pandroid.injected.attribution.file.location=C:\Users\Ura\AppData\Local\Temp\1614333244503-0 -Pandroid.injected.build.api=24 -Pandroid.injected.build.density=xxhdpi -Pandroid.injected.build.abi=armeabi-v7a,armeabi
2021-02-26 12:54:05,266 [6457157] INFO - ild.invoker.GradleBuildInvoker - Gradle build finished in 750 ms
2021-02-26 12:54:05,267 [6457158] INFO - a.gradle.run.MakeBeforeRunTask - Couldn't get post build models.
2021-02-26 12:54:05,267 [6457158] INFO - a.gradle.run.MakeBeforeRunTask - Gradle invocation complete, success = true
2021-02-26 12:54:05,275 [6457166] INFO - idea.run.AndroidProcessHandler - Adding device samsung-sm_a510f-3300376233021439 to monitor for launched app: com.medinq.superlines
2021-02-26 12:54:05,278 [6457169] INFO - notification.NotificationGroup - Notification group LaunchTaskRunner is already registered
java.lang.Throwable
at com.intellij.notification.NotificationGroup.<init>(NotificationGroup.kt:48)
at com.intellij.notification.NotificationGroup.<init>(NotificationGroup.kt:28)
at com.intellij.notification.NotificationGroup.<init>(NotificationGroup.kt:36)
at com.intellij.notification.NotificationGroup.<init>(NotificationGroup.kt:36)
at com.intellij.notification.NotificationGroup$Companion.toolWindowGroup(NotificationGroup.kt:93)
at com.intellij.notification.NotificationGroup$Companion.toolWindowGroup$default(NotificationGroup.kt:92)
at com.intellij.notification.NotificationGroup.toolWindowGroup(NotificationGroup.kt)
at com.android.tools.idea.run.LaunchTaskRunner.run(LaunchTaskRunner.java:183)
at com.intellij.openapi.progress.impl.CoreProgressManager$TaskRunnable.run(CoreProgressManager.java:932)
at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcessWithProgressAsync$5(CoreProgressManager.java:434)
at com.intellij.openapi.progress.impl.ProgressRunner.lambda$null$3(ProgressRunner.java:233)
at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcess$2(CoreProgressManager.java:166)
at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:627)
at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:572)
at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:61)
at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:153)
at com.intellij.openapi.progress.impl.ProgressRunner.lambda$submit$4(ProgressRunner.java:233)
at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1604)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
2021-02-26 12:54:05,279 [6457170] INFO - ools.idea.run.tasks.DeployTask - Installing application: com.medinq.superlines
2021-02-26 12:54:05,717 [6457608] INFO - a.run.tasks.AbstractDeployTask - 284526413ms TRC_BEG [23108][23108] : installer
2021-02-26 12:54:05,717 [6457608] INFO - a.run.tasks.AbstractDeployTask - 284526413ms TRC_BEG [23108][23108] : Command Dump
2021-02-26 12:54:05,717 [6457608] INFO - a.run.tasks.AbstractDeployTask - 284526413ms TRC_BEG [23108][23108] : get process ids
2021-02-26 12:54:05,717 [6457608] INFO - a.run.tasks.AbstractDeployTask - 284526563ms LOG_ERR [23108][23108] : Could not get package user id: run-as: Could not set capabilities: Operation not permitted
2021-02-26 12:54:05,717 [6457608] INFO - a.run.tasks.AbstractDeployTask - 284526564ms TRC_END [23108][23108] :
2021-02-26 12:54:05,717 [6457608] INFO - a.run.tasks.AbstractDeployTask - 284526564ms TRC_BEG [23108][23108] : CmdCommand::GetApksFromDump
2021-02-26 12:54:05,717 [6457608] INFO - a.run.tasks.AbstractDeployTask - 284526651ms TRC_END [23108][23108] :
2021-02-26 12:54:05,717 [6457608] INFO - a.run.tasks.AbstractDeployTask - 284526651ms TRC_BEG [23108][23108] : processing APK
2021-02-26 12:54:05,717 [6457608] INFO - a.run.tasks.AbstractDeployTask - 284526651ms TRC_END [23108][23108] :
2021-02-26 12:54:05,717 [6457608] INFO - a.run.tasks.AbstractDeployTask - 284526651ms TRC_END [23108][23108] :
2021-02-26 12:54:05,717 [6457608] INFO - a.run.tasks.AbstractDeployTask - 284526651ms TRC_END [23108][23108] :
2021-02-26 12:54:06,969 [6458860] INFO - a.run.tasks.AbstractDeployTask - Install successfully finished in 1 s 689 ms.. App restart successful without requiring a re-install.
2021-02-26 12:54:09,280 [6461171] INFO - run.AndroidLogcatOutputCapture - startCapture("samsung-sm_a510f-3300376233021439")
2021-02-26 12:54:49,324 [6501215] INFO - run.AndroidLogcatOutputCapture - stopCapture("samsung-sm_a510f-3300376233021439")
2021-02-26 12:54:49,324 [6501215] INFO - run.AndroidLogcatOutputCapture - stopAll()
2021-02-26 12:55:27,086 [6538977] INFO - rationStore.ComponentStoreImpl - Saving appBuiltInServerOptions took 15 ms, PropertiesComponent took 16 ms
2021-02-26 12:55:27,117 [6539008] INFO - rationStore.ComponentStoreImpl - Saving Project (name=SuperLines, containerState=ACTIVE, componentStore=C:\Users\Ura\AndroidStudioProjects\SuperLines) ProjectView took 16 ms
2021-02-26 12:55:37,825 [6549716] INFO - j.ide.actions.RevealFileAction - Exit code 1
2021-02-26 12:55:38,340 [6550231] INFO - rationStore.ComponentStoreImpl - Saving appExportableFileTemplateSettings took 16 ms
每个设备上的最大Java堆大小是不同的。您可以通过调用getMemoryClass来找到其大小。如果您的应用尝试分配更多空间,则无论设备的总体RAM状况如何(即使仍有可用RAM),都将引发OutOfMemoryError。JVM将在引发异常之前调用GC,但如果没有足够的空间可以释放下一个分配(因为已使用所有空间,或者因为它已被分割/不连续),则除了引发异常外,它别无选择。此堆限制不适用于本机代码,本机代码可能会超出该限制,具体取决于操作系统可以为您的应用程序保留多少。
出于调试目的,您可以在清单中设置largeHeap属性,但可能无法解决任何问题。您可以尝试逐步分配/初始化变量,以使其递增或将大型数据结构移至本机端以解决堆限制。您也可以将应用程序分成多个进程,因为堆限制是每个进程的,尽管通常在游戏中没有用。但是,在这种内存受限的设备(RAM少于2 GB)上,除了删除功能或使用质量较低的资产外,您无能为力。您可能希望将可以安装游戏的设备限制为具有最小RAM的设备,尽管我不认为Google Play具有此类过滤器。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句