jvm内存说明
针对 jvm 中的内存问题,一般指三种:内存抖动、内存泄漏、内存溢出
内存抖动
在一定时间内,频繁的创建对象然后又回收,使内存存在明显的上下波动
一般可能发生在循环中大量创建了局部对象
内存抖动的影响,抖动频繁的话会导致回收也频繁,而频繁的 GC 是会造成性能影响的。
因为每次 GC 时会挂起线程两次,二次还会产生内存碎片。
要考虑多复用对象,涉及模式:享元模式
内存泄漏
在程序运行期间,已经没有被使用的对象,引用却一直被持有,导致该对象无法被回收,此时就会造成内存泄漏
内存泄漏的影响:会造成无用对象无法被回收,使内存空间越来越小,最终可能会造成内存溢出
一般示例:Inflater 的创建需要 Context 对象,传入 Actiivty 时创建完后,需要将 Inflater 的实例对象置空,此时就会消除对 Activity 对象引用的持有,不然就会造成 Activity 的内存泄漏
内存溢出
当创建对象时,JVM 无法分配足够的内存,此时就会执行 GC,清理内存已获取足够的空间。
但如果 GC 后仍然无法获取足够的空间时,此时就会抛出异常 OOM(内存溢出),中断程序的运行
影响:会抛出异常,中断程序的运行
与内存抖动、内存泄漏不同,内存抖动、内存泄漏都不会影响程序的运行,最多只会影响程序运行的性能,内存溢出则会直接报错,中断程序的运行。
内存溢出是内存泄漏的持续结果。
解决办法:程序内存溢出后会在特定目录输出 .trace 文件,需要分析文件确定造成内存溢出的代码块。
常见的内存溢出:流使用完后未关闭、Cursor 使用完后未关闭、短时间创建大量的大内存对象