我最近在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)
我知道它是内存不足错误但是stacktrace没有提供任何在我的代码中启动它的信息。所以我正在努力追踪它,因为我有一个相对较大的应用程序(20个活动),有很多AsyncTasks和线程。不知道从哪里开始。任何帮助都是有益的
答案 0 :(得分:4)
您需要重新设计自己的应用。在任何情况下,您都不应该有20项活动。添加大量AsyncTasks和Threads只会使问题恶化。考虑将一些活动或AsyncTasks压缩在一起,以便使用更少的内存。不幸的是,没有神奇的方法来解决这个问题。您可以在DDMS中使用线程分析,以查看哪些线程使用的内存最多;这应该可以帮助您找到从哪里开始。为此,请插入设备/启动模拟器。在Eclipse中,转到DDMS并在左侧面板中选择应用程序的包名称。单击“更新线程”按钮,您的应用程序正在使用的所有线程将显示在右侧面板上。您可以单击一个并点击刷新以获取更多信息。要查看内存的来源,请单击应用程序包并点击“更新堆”(看起来像一个小小的绿色垃圾桶。)转到右侧面板上的堆,然后点击Cause GC。这将显示您的应用程序在内存中的所有内容。这应该至少可以帮助你开始。
答案 1 :(得分:0)
您可以使用此代码段登录AsynTasks以及活动 -
MemoryInfo mi = new MemoryInfo();
ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
activityManager.getMemoryInfo(mi);
long availMem = mi.availMem ;
获取显示内存信息,以便了解问题开始出现的位置。
另外,考虑在onLowMemory中设置一个断点,并确保它冻结VM而不是线程并检查线程以查看导致问题的线程。