我最近在 Android 市场上上传了我的应用程序,但收到以下错误,我无法追溯它:
java.lang.OutOfMemoryError: thread creation failed
at java.lang.VMThread.create(Native Method)
at java.lang.Thread.start(Thread.java:1327)
at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:901)
at java.util.concurrent.ThreadPoolExecutor.processWorkerExit(ThreadPoolExecutor.java:950)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1086)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
at java.lang.Thread.run(Thread.java:1096)
我知道这是内存不足错误,但堆栈跟踪没有提供它在我的代码中启动的任何信息。因此,我正在努力追踪它,因为我有一个相对较大的应用程序(20 个活动),其中包含大量异步任务和线程。不知道从哪里开始。任何帮助都会有益
您需要重新设计您的应用程序。在任何情况下您都不应该有 20 个活动。添加大量异步任务和线程只会使问题变得更糟。考虑将一些活动或异步任务压缩在一起,以使用更少的内存。不幸的是,没有任何神奇的方法可以调用来解决这个问题。您可以使用 DDMS 中的线程分析来查看哪些线程使用最多的内存;这应该可以帮助您找到从哪里开始。为此,请插入您的设备/启动模拟器。在 Eclipse 中,转到 DDMS 并在左侧面板中选择应用程序的包名称。单击“更新线程”按钮,您的应用程序正在使用的所有线程将显示在右侧面板上。您可以单击其中一个并点击“刷新”以获取有关它的更多信息。要查看内存的去向,请单击应用程序的包并点击“更新堆”(看起来像一个绿色的小垃圾桶)。转到右侧面板上的“堆”并点击“Cause GC”。这将向您显示应用程序内存中的所有内容。这至少应该可以帮助您入门。
您可以使用此代码片段登录 AsynTasks 以及活动 -
MemoryInfo mi = new MemoryInfo();
ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
activityManager.getMemoryInfo(mi);
long availMem = mi.availMem ;
获取显示内存信息,以便了解问题开始出现的位置。
此外,请考虑在 onLowMemory 中设置一个断点,并确保它冻结虚拟机而不是线程,并检查线程以查看哪些线程导致了问题。
自己捕获崩溃并记录应用程序的总线程数。查一下是否有漏线的情况