1 内存溢出

内存溢出(OutOfMemoryError)就是JVM中没有空闲内存,垃圾回收器回收垃圾之后也无法提供足够的内存,导致内存溢出。
内存溢出一般由两方面导致:虚拟机的堆内存设置太小;内存中创建了很多大对象,垃圾回收器之后也不能回收足够的内存空间。
在发生OOM之前一般都会进行垃圾回收,如果能回收足够的内存空间就不会出现OOM异常;如果垃圾回收之后也不能回收足够空间,此时就会发生OOM。但是不是任何情况下,OOM之前都会触发垃圾回收,比如要分配一个超大对象,超过堆的大小,那么即使垃圾回收之后也不能解决问题,因此就不会进行垃圾回收。

2 内存泄漏(Memory Leak)

严格意义上,只有对象不会再被程序调用,但是GC又回收不掉,此种情况就叫内存泄漏。如果对象的生命周期很长,不容易被GC,导致OOM,也可以称为内存泄漏。
内存泄漏并不会立即引起程序崩溃,但随着泄漏的内存逐渐增多,直到内存耗尽,最终出现OutOfMemory异常。
内存泄漏案例:

  • 单例模式:有些单例对象的声明周期与程序运行时间一样长,此时该单例对象持有了外部对象的引用,当GC发生时,是不能会后被引用的外部对象的,就会导致内存泄漏;
  • 资源未关闭导致内存泄漏:比如数据库连接、网络连接和io连接等,如果不close掉,最终引起内存泄漏。
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐