在虚拟机(如Dalvik)中运行的垃圾收集语言中的内存泄漏类型



在处理垃圾收集语言时不存在两种类型的内存泄漏:用户编码和运行时环境吗?也就是说,糟糕的用户代码(比如大量的全局静态引用)与运行时的bug,或者它们被认为是相同的?通常用于查找它们的工具是相同的吗?

运行时很少有内存泄漏错误,主要是因为很少有收集,而这些收集是这些错误的主要来源。

您将使用内存配置文件来查找此类内存泄漏。您可以使用VisualVM来处理小堆转储,但对于较大的堆,我使用像YourKit这样的商业分析器。

据我所知,糟糕的用户代码是导致内存泄漏的主要问题。在Dalvik中,java堆使用dlmalloc来分配内存,这可能会导致更多的内存碎片;即使调用GC,虚拟机也可能不会清理java堆,因为Linux中每页4K是基本单位。所以android低内存页面(http://developer.android.com/training/articles/memory.html)建议我们在同一时间分配/释放对象,以获得更多的连续内存,这看起来像手工的分代内存管理(http://developer.android.com/training/articles/memory.html#AllocatingRAM)。

用户代码内存泄漏可以通过MAT工具分析。试图理解Dalvikvm和内存泄漏

如果您使用的是一种完善的语言/虚拟机,那么由于"运行时中的错误"而导致的泄漏是极不可能的。花时间在应用程序代码中查找误用引用。

最新更新