简单直观的
一个方法是:对
一个对象
添加引用计数器。每当有地方引用它时,计数器的值加 1;当引用失效时,计数器de的值减 1.而当计数器的值为 0 时这个对象就不会再被使用,判断为已死。但这种
方法有些情况会不准确:比如当对象 A 中有
一个字段指向了对象 B,而对象 B 中 也有
一个字段指向了对象 A,而事实上他们俩都不再使用,但计数器的值永远都不可能为 0,也就不会被回收,然后就发生了内存泄露。
正确的
方法是:可达性分析. 所有
生成的对象都是
一个为"GCRoots"的根的子树。从 GC Roots 开始向下
搜索,
搜索所经过的路径称为引用链,当
一个对象到 GC Roots 没有任何引用链可以到达时,就称这个对象是不可达的或者是不可引用的,也就是已经死去的对象,可以被 GC 回收了。那哪些可以作为gc root呢,有栈中的本地变量,
方法区中的静态变量,本地
方法栈中的变量,正在运行中的线程,它们有
一个特性,就是它只会引用其他对象,而不会被其他对象引用。
本文转自:https://blog.csdn.net/qq_59614812/article/details/122901619
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。