zoukankan      html  css  js  c++  java
  • 垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?

    一、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?

      1对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。

           通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的"。当GC确定一些对象为"不可达"时,GC就有责任回收这些内存空间。

         2、可以。程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。

    二、这里我们详细了解一下System.gc()的工作原理:

     Java中的内存分配是随着new一个新的对象来实现的,这个很简单,而且也还是有一些可以“改进”内存回收的机制的,其中最显眼的就是这个System.gc()函数。

      乍一看这个函数似乎是可以进行垃圾回收的,可事实并不是那么简单。
      其实这个gc()函数的作用只是提醒虚拟机:程序员希望进行一次垃圾回收。但是它不能保证垃圾回收一定会进行,而且具体什么时候进行是取决于具体的虚拟机的,不同的虚拟机有不同的对策。

      那么下一个问题就是:gc()进行回收的准则是什么?也就是说什么样的对象可以被回收?
    简单来说就是:没有被任何可达变量指向的对象。这里的可达是我发明的……意思就是能够找到的,那什么样的是不可达的呢?
    比如说:

    1 a.v = b;
    2 b.v = c;
    3 /*
    4  *Watch out !
    5  */
    6 a.v = d;

    看一下这段代码:
    第一行:对象a的变量v指向了对象b
    第二行:对象b的变量v指向了对象c
    第六行:对象a的变量v指向了变量d。
    这个时候,虽然变量c指向的对象有c以及b.v指向它,但是它们都已经不可达了,为什么?因为唯一可以找到它们的是a.v,但是现在a.v指向了d,所以他们就是不可达的了。

    理由也很直观:没有任何可达变量指向你,你还有活下去的理由吗?你就算活下去谁能找得到你呢?

    所以说,C++中将释放了的指针置为null的习惯要保留到Java中,因为这有可能是你释放内存的唯一途径。

    最后的箴言:不要频繁使用gc函数。
    我的建议是:保持代码健壮(记得将不用的变量置为null),让虚拟机去管理内存。

  • 相关阅读:
    华丽的NHibernate
    Linq to NHibernate入门示例
    更新部分字段 NHibernate
    Entity Framework 与 面向对象
    开源框架之TAB控件
    MEF插件系统中通信机制的设计和实现
    用CQRS+ES实现DDD
    Unit of work + Repository
    [开源]C#二维码生成解析工具,可添加自定义Logo (转)
    就是这么简单(续)!使用 RestAssuredMockMvc 测试 Spring MVC Controllers(转)
  • 原文地址:https://www.cnblogs.com/wangjintao-0623/p/9598922.html
Copyright © 2011-2022 走看看