Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当OOM发生时,如何让dalvik转储整个应用程序堆内存_Java_Eclipse_Adt_Out Of Memory_Dalvik - Fatal编程技术网

Java 当OOM发生时,如何让dalvik转储整个应用程序堆内存

Java 当OOM发生时,如何让dalvik转储整个应用程序堆内存,java,eclipse,adt,out-of-memory,dalvik,Java,Eclipse,Adt,Out Of Memory,Dalvik,我是Android开发的初学者。目前,我正在寻找一种在发生内存不足错误时自动转储内存的方法。我读到在jvm参数中添加-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=/some/path,以便在内存耗尽时转储堆。但我找不到放在哪里。 有人知道吗?非常感谢。您列出的标志是针对Oracle虚拟机的,而不是Dalvik 没有等效的标志,但可以实现类似的行为。android.os.Debug.dumpHprofData()方法将当前堆转储写入您指定的文件。当

我是Android开发的初学者。目前,我正在寻找一种在发生内存不足错误时自动转储内存的方法。我读到在jvm参数中添加-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=/some/path,以便在内存耗尽时转储堆。但我找不到放在哪里。
有人知道吗?非常感谢。

您列出的标志是针对Oracle虚拟机的,而不是Dalvik

没有等效的标志,但可以实现类似的行为。
android.os.Debug.dumpHprofData()
方法将当前堆转储写入您指定的文件。当与
Thread.setDefaultUncaughtExceptionHandler()
设置的
UncaughtExceptionHandler
组合时,您可以在任何线程中捕获OOM并自行处理报告。(只是不要太激动……毕竟你已经没有记忆了。)

您需要将处理程序链接到Android system one,另请参见


这看起来像是一个集合。

谢谢fadden,我遵循了你的方式,但似乎全局未捕获异常处理程序无法捕获OOM异常,尽管可以捕获其他异常,例如空指针异常。我不确定我错过了什么,或者这种方式不可行。它可能不起作用。如果你完全没有内存,你可以让OOM报告OOM。如果您未能分配适当大的内容(如位图),您将有足够的空间。
logcat
输出应该提供一些细节。这是一个非常简单的演示,创建一个静态hashmap,然后将位图对象保存到其中,使其成为OOM。代码片段如下所示:for(int i=0;i<10;i++){String bitMapIdOOM=bitmapId+“+i;bittmap mBitmapOOM=BitmapFactory.decodeResource(getResources(),R.drawable.bike);sBitmapCache.put(bitMapIdOOM,mBitmapOOM);},它需要大约800万字节。这意味着它应该有足够的空间。E/dalvikvm堆(11636):8294416字节分配内存不足@法登,有什么建议吗?另一种方法可能是创建一个单独的进程监视器,监视目标应用程序。当它OOMs时,进程监视器停止它并转储其堆。但我不知道如何实施它。:-)好的,您可以附加一个调试器(比如Eclipse的一部分),并从运行菜单中配置一个“异常断点”。对于捕获的异常和未捕获的异常,将其设置为在
OutOfMemoryError
时中断。此时,您应该能够将
dumpHprofData
方法作为表达式进行计算(当您在断点处停止时,Eclipse可以执行任意代码)。您还可以尝试使用
java.lang.Runtime.freemory
调用来猜测何时内存不足,并在OOM之前转储堆。