很多人把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),让虚拟机去管理内存。

最新文章

  1. JavaScript进阶之路——认识和使用Promise,重构你的Js代码
  2. spark发行版笔记13
  3. JQuery操作HTML文档
  4. iOS之Scanning的实现
  5. springMVC3 ckeditor3.6 图片上传 JS回调
  6. 浅析CSS负边距
  7. python会什么比c慢
  8. C#实现的异步Socket服务器
  9. Moutain Tai notes
  10. c#操作word文档之简历导出
  11. lucene 索引查看工具
  12. [翻译]HBase 的 MVCC 和内建的原子操作
  13. Video Pooling
  14. spring cloud 入门系列七:基于Git存储的分布式配置中心
  15. .Net 登陆的时候添加验证码
  16. C# 文件/文件夹压缩解压缩
  17. 解决linux下无线网卡被物理禁用问题
  18. #ifndef HeaderName_h #define HeaderName_h #endif 使用详解
  19. html5-列表
  20. Oracle Redo log 状态及工作原理解析

热门文章

  1. (转)解析json xml
  2. python aiohttp sancio 框架性能测试
  3. 用Python处理邮件,全文完
  4. python3中zipfile模块的常用方法
  5. [POI2001]Peaceful Commission
  6. SQL函数学习(十六):STUFF()函数
  7. Mac Sublime Text 3 配置Python环境及安装插件
  8. KVC与KVO的不同
  9. 魅族 -- 禁止D及以下级别LOG的输出
  10. t-sql 笔记(2)