- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
假设有一个 Tree 对象,有一个根 TreeNode 对象,每个 TreeNode 都有 leftNode 和 rightNode 对象(例如 BinaryTree 对象)
如果我打电话:
myTree = null;
在树中相关的 TreeNode 对象到底发生了什么?也将被垃圾收集,或者我必须将树对象内的所有相关对象设置为空?
最佳答案
Java 中的垃圾收集是在“可达性”的基础上进行的。 JLS 对该术语的定义如下:
"A reachable object is any object that can be accessed in any potential continuing computation from any live thread."
只要一个对象是可访问的1,它就没有资格进行垃圾回收。
JLS 将其留给 Java 实现来确定如何确定一个对象 是否可以 可访问。如果实现无法确定,则可以自由地将理论上无法访问的对象视为可访问的……而不是收集它。 (事实上,JLS 允许实现永远不收集任何东西!尽管没有实际的实现会这样做2。)
在实践中,(保守的)可达性是通过追踪来计算的;查看从类(静态)变量和线程堆栈上的局部变量开始的引用可以达到什么。
这对您的问题意味着什么:
If i call:
myTree = null;
what really happens with the related TreeNode objects inside the tree? Will be garbage collected as well, or i have to set null all the related objects inside the tree object??
让我们假设 myTree
包含对树根的最后剩余的可访问引用。
null
分配给对内部节点的引用。)null
分配给对内部节点的引用是错误的。您正在分解一个其他东西可能稍后会尝试使用的数据结构。)如果 myTree
不 包含对树根的最后剩余 可达引用,那么将内部引用置空是一个错误原因同上 3.。
那么应该你什么时候null
东西来帮助垃圾收集器?
您需要担心的情况是,当 您 可以确定某个单元格(本地、实例或类变量或数组元素)中的引用将不会被再次使用,但是编译器和运行时不能!这些案例大致分为三类:
仍在作用域内的局部变量中的对象引用......但不会被使用。例如:
public List<Pig> pigSquadron(boolean pigsMightFly) {
List<Pig> airbornePigs = new ArrayList<Pig>();
while (...) {
Pig piggy = new Pig();
...
if (pigsMightFly) {
airbornePigs.add(piggy);
}
...
}
return airbornePigs.size() > 0 ? airbornePigs : null;
}
在上面,我们知道如果 pigsMightFly
为 false,则不会使用列表对象。但是没有一个主流的 Java 编译器可以解决这个问题。
实例变量或数组单元格中的对象引用,其中数据结构不变量意味着它们不会被使用。 @edalorzo 的堆栈示例就是一个例子。
需要注意的是,编译器/运行时有时会发现一个作用域内的变量实际上是死的。例如:
public void method(...) {
Object o = ...
Object p = ...
while (...) {
// Do things to 'o' and 'p'
}
// No further references to 'o'
// Do lots more things to 'p'
}
一些 Java 编译器/运行时可能能够在循环结束后检测到不需要 'o',并将变量视为死变量。
1 - 事实上,我们在这里谈论的是strong可达性。当您考虑软引用、弱引用和幻像引用时,GC 可达性模型会更加复杂。但是,这些与 OP 的用例无关。
2 - 在 Java 11 中有一个名为 Epsilon GC 的实验性 GC。明确不收集任何东西。
关于java - java中的垃圾收集器-将对象设置为null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5690309/
最近开始学习oracle和sql。 在学习的过程中,我遇到了几个问题,我的 friend 在接受采访时被问到这些问题。 SELECT * FROM Employees WHERE NULL IS N
这个问题在这里已经有了答案: Can we subtract NULL pointers? (4 个回答) 关闭 2 个月前。 是否定义了NULL - NULL? (char *)NULL - (ch
是否有推荐的方法(根据 .net Framework 指南)检查 null,例如: if (value == null) {//code1} else {//code2} 或 if (value !=
我正在尝试将值插入数据库,但出现这样的错误任何人都可以告诉我为什么该值为空,如下所示: An exception occurred while executing 'INSERT INTO perso
这个问题在这里已经有了答案: String concatenation with a null seems to nullify the entire string - is that desire
您好,我正在 Android 联系人搜索模块中工作。我正在查询下方运行。 cur = context.getContentResolver().query(ContactsContract.Data.
下面的 SQL 表定义说明了从我的 MYSQL 数据库创建表的语句之一,该数据库是由我公司的前开发人员开发的。 DROP TABLE IF EXISTS `classifieds`.`category
我主要有应用程序开发背景。在编程语言中 variable == null或 variable != null有效。 当涉及到 SQL 时,以下查询不会给出任何语法错误,但也不会返回正确的结果。 sel
我在尝试检查某些元素是否为 NULL 时遇到段错误或不。任何人都可以帮忙吗? void addEdge(int i, int j) { if (i >= 0 && j > 0)
在 SQL 服务器中考虑到以下事实:Col1 和 Col2 包含数值和 NULL 值 SELECT COALESCE(Col1,Col2) 返回一个错误:“COALESCE 的至少一个参数必须是一个不
在 SQL 服务器中考虑到以下事实:Col1 和 Col2 包含数值和 NULL 值 SELECT COALESCE(Col1,Col2) 返回一个错误:“COALESCE 的至少一个参数必须是一个不
下面查询的关系代数表达式是什么?我找不到“Is Null”的表达式。 SELECT reader.name FROM reader LEFT JOIN book_borrow ON reader.ca
我正在尝试使用三元运算符来检查值是否为 null 并返回一个表达式或另一个。将此合并到 LINQ 表达式时,我遇到的是 LINQ 表达式的 Transact-SQL 转换试图执行“column = n
我在给定的代码中看到了以下行: select(0, (fd_set *) NULL, (fd_set *) NULL, (fd_set *) NULL, &timeout); http://linux
var re = /null/g; re.test('null null'); //> true re.test('null null'); //> true re.test('null null')
这个问题在这里已经有了答案: 关闭 13 年前。 我今天避开了一场关于数据库中空值的激烈辩论。 我的观点是 null 是未指定值的极好指示符。团队中有意见的其他每个人都认为零和空字符串是可行的方法。
由于此错误,我无法在模拟器中运行我的应用: Error:null value in entry: streamOutputFolder=null 或 gradle - Error:null value
我正在尝试在 Android 应用程序中创建电影数据库,但它返回错误。知道这意味着什么吗? public Cursor returnData() { return db.query(TABLE
我一直在检查浏览器中的日期函数以及运行时间 new Date (null, null, null); 在开发工具控制台中,它给出了有效的日期 Chrome v 61 回归 Sun Dec 31 189
为什么 NA==NULL 会导致 logical (0) 而不是 FALSE? 为什么 NULL==NULL 会导致 logical(0) 而不是 TRUE? 最佳答案 NULL 是一个“零长度”对象
我是一名优秀的程序员,十分优秀!