提高面试能力第二天

Java的内存回收

即JVM如何回收那些无用的对象所占据的内存。

通过关键字new创建Java对象,即可视作为Java对象申请内存空间,JVM会在堆内存中为每个对象分配空间;当一个Java对象失去引用时,JVM的垃圾回收机制会自动清除它们,并回收它们所占用的内存空间。

是否回收一个对象的标准在于:是否还有引用变量引用。只要有引用变量引用对象,垃圾回收机制就不会回收它。

JVM的垃圾回收机制采用有向图方式来管理内存中的对象,因此可以方便地解决循环引用的问题。

三种状态

  • 可达状态
    当一个对象被创建后,有一个以上的引用变量引用它。在有向图中可从起始顶点导航到该对象,那它就处于可达状态,程序可通过引用变量来调用该对象的属性和方法。
  • 可恢复状态
    如果程序中某个对象不再有任何引用变量引用它,它将先进入可恢复状态,此时从有向图的起始顶点不能导航到该对象。在这个状态下,系统的垃圾回收机制准备回收该对象所占用的内存。在回收该对象之前,系统会调用可恢复状态的对象的finalize方法进行资源清理,如果系统在调用finalize方法重新让一个以上引用变量引用该对象,则这个对象会再次变为可达状态;否则,该对象将进入不可达状态。
  • 不可达状态
    当对象的所有关联都被切断,且系统调用所有对象的finalize方法依然没有使该对象变成可达状态,那这个对象将永久性地失去引用,最后变成不可达状态。只有当一个对象处于不可达状态时,系统才会真正回收该对象所占有的资源。

四种引用方式

强引用、软引用、虚引用和弱引用

  • 强引用
    所有引用变量都是强引用的方式。
    由于JVM肯定不会回收轻音乐所引用的Java对象,因此强引用是造成Java内存泄漏的主要原因之一。

  • 软引用(SoftReference)
    对于只有软引用的对象而言,当系统内存空间足够时,它不会将系统回收,程序也可使用该对象;当系统内存空间不足时,系统将会回收它。

//通知系统进行垃圾回收
System.gc();
System.runFinalization();

系统不会回收被缓存的字符串常量。

  • 弱引用(WeakReference)
    当系统垃圾回收机制运行时,不管系统内存是否足够,总会回收该对象所占用的内存。
    当长须有大量的Java对象需要使用弱引用来引用时,可以考虑使用WeakHashMap来保存它们。
  • 虚引用(PhantonReference)
    软引用和弱引用可以单独使用,但虚引用不能单独使用,单独使用虚引用没有太大的意义。虚引用的主要作用就是跟踪对象被垃圾回收的状态,长须可以通过检查与虚引用关联的引用队列中是否已经包含指定的虚引用,从而了解虚引用所引用对象是否将被回收。
    与软引用和弱引用不同的是,虚引用在对象被释放之前,将把它对应的虚引用添加到它的关联的引用队列中,这使得可以在对象被回收之前采用行动。
    虚引用主要用于跟踪对象被垃圾回收的状态,虚引用不能单独使用,虚引用必须和引用队列(ReferenceQueue)联合使用。

内存泄漏

程序运行过程中会不断地分配内存空间,那些不在使用的内存空间应该及时回收它们,从而保证系统可以再次使用这些内存,如果存在无用的内存没有被回收回来,则这种情况被称为内存泄漏。

垃圾回收机制

跟踪并监控每个Java对象,当某个对象处于不可达状态时,回收该对象所占用的内存,清楚内存分配,回收过程中产生的内存碎片。

垃圾回收机制算法

  • 串行回收和并行回收

  • 并发执行(Concurrent)和应用程序停止(Stop-the-world)
    Stop-the-world的垃圾回收方式在执行垃圾回收的同时会导致应用程序的暂停;
    并发执行的垃圾回收虽然不会导致应用程序的暂停,但由于并发执行垃圾回收需要解决和应用程序的执行冲突,因此并发执行垃圾回收的系统开销比Stop-the-world更高,而且执行时也需要更多的堆内存。

  • 压缩和不压缩和复制
    为了减少内存碎片,支持压缩的垃圾回收器会把所有的活对象搬迁到一起,然后将之后占用的内存全部回收。
    不压缩式的垃圾回收器只是回收内存,这样回收回来的内存不可能是连续的,因此将会有较多的内存碎片。
    复制式的垃圾回收会将所有可达对象复制到另一块相同的内存中,这种方式的优点是垃圾回收过程不会产生内存碎片,但缺点也很明显,需要复制数据和额外的内存。

现行的垃圾回收器用分代的方式来采用不同的回收设计。

Young(年轻代)、Old(老年代)、Permanent(永久代)

分代回收的一个依据就是对象生存时间的长短,然后再根据不同代采取不同的垃圾回收策略。
绝大多数的对象不会被长时间引用,这些对象在其Young期间就会被回收。
很老的对象和很新的对象之间很少存在相互引用的情况。
young代垃圾回收 复制回收
Old代的空间要比Young代的空间更大
Old代垃圾回收的执行频率无需太高,因为很少有对象会死掉。每次对old代执行垃圾回收需要更长的时间来完成。 标记压缩
permanent代
主要用于装载Class方法等信息,默认为64MB。
垃圾回收机制通常不会回收permanent代中的对象。

常见的垃圾回收器

  • 串行回收器
    young代采用串行复制算法;old代采用串行标记压缩算法。
    串行标记压缩算术:Mark(表示可达对象)、sweep(清楚)、compact(压缩)
  • 并行回收器
  • 并行压缩回收器
    系统首先将old划分成几个固定大小的区域。在Mark阶段,多个垃圾回收线程会并行标记old代中的可达对象。当某个对象被标记为可达对象时,还会更新该对象所在区域的大小,以及该对象的位置信息。
    summary,直接操作old代的区域,而不是单个的对象。
    compact
  • 并发标识-清除回收器
    old代68%满的时候就开始回收。
    对old代的回收多数是并发操作:
    initial mark —>concurrent marking phase—>remark
    它只需两次短暂的暂停,而其他过程都是与应用程序并发执行的,因此对实时性要求较高的程序更合适。
    CMS不会进行内存压缩,因此必须保存一份可用空间的列表。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ava实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),可运行高分资源 Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值