内存溢出(OOM) (1)没有空闲内存,并且垃圾收集器也无法提供更多内存 (2)没有空闲内存的情况 ① Java虚拟机的堆内存设置不够,可通过参数-Xms和-Xmx调整 ② 代码中创建了大量大对象,并且长时间不能被垃圾收集器收集(存在被引用) 当我们不断添加新类型的时候,永久代在运行时存在大量动态类型生成的场合:类似intern字符串缓存会占用太多空间,会导致OOM问题,后面元数据区的引入,直接内存不足也会导致OOM
引用 (1)强引用-不回收 ① 使用new操作符创建一个新的对象并将其赋值给一个变量时,这个变量就成为了指向该对象的一个强引用 ② 强引用的对象是可触及的,垃圾收集器就永远不会回收掉被引用的对象,强引用是造成Java内存泄漏的主要原因之一 (2)软引用-内存不足即回收 ① 软引用用来描述一些还有用但非必须的对象,只被软引用关联着的对象在系统将要发生内存溢出前,会把这些对象列进回收范围之中进行第二次回收,如果回收还没有足够的内存,才会抛出内存溢出异常 ② 当内存足够,不会回收软引用的可达对象;当内存不够会回收软引用的可达对象 (3)弱引用-发现即回收 ① 弱引用也是描述那些非必须的对象**,只被引用关联的对象只能生存到下一次垃圾收集发生为止,只要发现弱引用,GC都会回收掉** ② 由于垃圾回收器的线程通常优先级很低,这种情况下,弱引用对象就可以存在较长的时间 ③ 弱引用与软引用最大不同在于,软引用在GC进行回收时,需要通过算法检查是否可以回收,而弱引用一经发现就会被回收 (4)虚引用-对象回收跟踪 ① 虚引用不能单独使用,也无法通过虚引用来获取被引用的对象,当试图通过虚引用的get方法取得对象时总是null ② 为一个对象设置虚引用关联的唯一目的在于跟踪垃圾回收过程,例如能在这个对象被收集器回收时收到一个系统通知 ③ 虚引用必须和引用队列一起使用,虚引用创建时必须要提供一个引用队列作为参数。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象后将这个虚引用加入引用队列,来通知应用程序对象的回收情况 ④ 由于虚引用可以跟踪对象的回收时间,也可以将一些资源释放操作放置在虚引用中个执行和记录 ⑤ 案例