zoukankan      html  css  js  c++  java
  • 浅谈Java中的System.gc()的工作原理

    很多人把Java的“效率低下”归咎于不能自由管理内存,但我们也知道将内存管理封装起来的好处,这里就不赘述。

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

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

    那么下一个问题就是:gc()进行回收的准则是什么?也就是说什么样的对象可以被回收?
    简单来说就是:没有被任何可达变量指向的对象。这里的可达是我发明的……意思就是能够找到的,那什么样的是不可达的呢?
    比如说:
    a.v = b;
    b.v = c;
    /*
     *Watch out !
     */
    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),让虚拟机去管理内存。

  • 相关阅读:
    博客园
    未释放的已删除文件
    ssh连接缓慢
    剑指 Offer 38. 字符串的排列
    剑指 Offer 37. 序列化二叉树
    剑指 Offer 50. 第一个只出现一次的字符
    剑指 Offer 36. 二叉搜索树与双向链表
    剑指 Offer 35. 复杂链表的复制
    剑指 Offer 34. 二叉树中和为某一值的路径
    剑指 Offer 33. 二叉搜索树的后序遍历序列
  • 原文地址:https://www.cnblogs.com/ruber/p/5558888.html
Copyright © 2011-2022 走看看