A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 时光未桀 中级黑马   /  2019-4-29 16:36  /  593 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 时光未桀 于 2019-4-29 20:54 编辑

  • 对象何时被丢弃:两个基本原则:<1>发用对象;<2>回收被无用对象占用的空间,使得该空间能被程序再次使用。
  • 垃圾收集算法大概有10种,大部分算法采用根基法:从根基开始可达的对象为活动对象,不会回收;根基通过任意路径不可达的对象,会被回收。
    引用计数法(唯一没有使用根基的算法):程序创建引用及引用超出范围时,JVM须适当增减引用数,当对象引用数为0,可垃圾收集。
  • 对象被丢弃是否立即回收
    当对象为NULL,或重定向了对象引用者,则认为他没有存在的必要;引用计数法判定对象是否被抛弃,其他算法来确定何时及如何回收;GC要在时间和空间做平衡,须同时满足2个条件(有对象要回收,系统需要回收)。
  • 垃圾回收
    GC两个途径发消息给JVM:<1>对象的所有引用变量移走<2>System.gc() ,仅算是一个请求,并不会立即回收,只是对会说算法加权,使得回收容易发生或提早,或者是回收较多;
    GC是为所有Java应用程序进程服务,任何一个进程无权命令GC去做什么,怎么做,做多少。
  • finalize方法
    该函数最多运行一次。
    垃圾收集器将对象从内存中清除出去之前做必要的清理工作,改函数没有自动实现链式调用,须手动实现。super.finalize()代表先释放自己的资源,再释放父类资源。
    有人讲很多对象资源的释放都放在该函数里面,不赞成。原因:<1>GC为了支持该函数,会对覆盖整个函数的对象做很多附加工作。<2>finalize运行完成后,对象可能变为可达的(前面根基法提到,对象可达,不会被回收),所以GC还要再检查确定一次。<3>GC调用finalize是不确定的,通过此方式释放资源也是不确定的。
  • 总体来说,垃圾回收器是一种低优先级线程,在内存空闲时运行。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马