zoukankan      html  css  js  c++  java
  • JVM——垃圾回收(GC)

    GC简单介绍

    java语言执行在java虚拟机(jvm)上。为了解决有限的空间和性能的保证这个矛盾体,jvm所具备的GC能力。能够有效的清除不用的对象。使空间的利用更加合理。以下介绍该机制的原理。

    推断对象已废弃

    • 引用计数法
      给每个对象都配备一个计数器,对于该对象,若添加一个指向它的引用,则计数器加1。每失效一个引用。则计数器减一。
      可是,假设两个对象互相引用,但都对于外部都已失去用途,则这种两个对象是无法被计数为0的,由于他们的计数器永远都仅仅为1。
    • 可达性分析法
      为了解决引用计数法的缺陷,我们引入可达性分析。
      从引用链的顶端root開始,仅仅要在这条引用链上的对象都是实用的,因此不应该被回收。而对于剩下的对象,一定是不可到达的对象,也就没什么意义了。

    怎样释放没用的对象空间

    • 标记清除
      将废弃的对象空间标记出来,直接清除就可以。


      可是。这样会造成空间的碎片过多。

      假设有较大的对象须要空间,则会有更大的可能,它无法找到这种空间。

    • 复制法
      将堆空间分为两块,最好还是叫做from和to。每次new对象的时候。先放在from上,(to块保持空暇),直到from区域放满。这是要进行垃圾回收,将存活的对象拷贝到 to上,然后清空from区域,并将from和to进行互换,又一次開始。
      缺点是,总有一部分空间要充当to区域,因此该区域总是空暇着等待交换。造成内存的浪费。

    • 标记整理
      相似于标记清楚,仅仅只是是在标记之后不是简单的清除,而是将存货对象整理好。一个一个排在一起。让后释放剩下的连续的一整块空间。这样做的坏处是。须要对全部对象进行复制移动,比較耗时。

    • 分代处理
      将堆内存区分为Eden区,survivorFrom区、surviorTo区(以上三个都属于年轻代),老年代和永久代。

      1. 当新建对象的时候通常是首先放在年轻代的Eden和surviorFrom中,当满了之后,将存活对象放入survivorTo中(及MinorGC),放不下的直接放入年老代。互换survivor的from和to区。

      2. 当老年代也满了之后。将执行一整个的大清洗FullGC,将全部堆内存(除了永久代)进行一次完整的GC。
      3. 永久代是不会在主程序执行期间进行GC的。永久代主要存放Class类信息。
  • 相关阅读:
    SVN中Revert changes from this revision 跟Revert to this revision
    bootstrap中如何使input中的小图标获得点击事件
    基于Bootstrap使用jQuery实现输入框组input-group的添加与删除-改进版
    MVC4 Controller 与 WebApi 的 Session 传值问
    MVC Razor与javascript混编(js中嵌入razor)
    Asp.net mvc怎么在razor里写js代码
    MVC后台数据赋值给前端JS对象
    ASP.NET MVC自定义验证Authorize Attribute(包含cookie helper)
    ASP.Net MVC4+Memcached+CodeFirst实现分布式缓存
    【记录】【solr】solr7.2.1原子更新
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/7399037.html
Copyright © 2011-2022 走看看