方法返回后的链表(节点)范围和内存分配或垃圾回收

时间:2012-01-14 18:59:35

标签: java scope linked-list

也许我现在不在乎,但我对范围,内存分配或垃圾收集有疑问。

LinkedIntList类有一个私有字段front,它是ListNode类型的变量(第4行)。 链接列表的其余部分是通过调用add()函数(第29行)构建的。

问题:当返回add()时(第39行),ListNode是否在add()中创建,由new创建,超出范围并且应该被垃圾收集?或者它们是保留的,因为前面指向它们?

1 // Simple first version of LinkedIntList with just a constructor
2 // and methods for add and toString.
3
4 public class LinkedIntList {
5 private ListNode front; // first value in the list
6
7 // post: constructs an empty list
8 public LinkedIntList() {
9 front = null;
10 }
11
//....
//....
28 // post: appends the given value to the end of the list
29 public void add(int value) {
30 if (front == null) {
31 front = new ListNode(value);
32 } else {
33 ListNode current = front;
34 while (current.next != null) {
35 current = current.next;
36 }
37 current.next = new ListNode(value);
38 }
39 }
40 }

2 个答案:

答案 0 :(得分:2)

当add()返回时,创建并附加到列表的ListNode是保留的,因为它是前面的链指向。在这种情况下函数返回(如值)并且无法从外部引用时,按值传递给函数的参数超出范围。但是ListNode是一个新的Object创建,它在内存中分配空间,并且在函数返回时仍然保留。

当引用丢失到内存位置时,将完成垃圾收集。当您的程序运行时,您的引用将处于活动状态,因此无法进行垃圾回收。

答案 1 :(得分:1)

垃圾收集器不会收集对象,直到它有一个“实时”引用,即直到它可以访问(即循环依赖关系不计算)。您可能需要查看mark and sweep算法。

您的ListNode是列表的元素,因此根据定义不可达(只要您保留对列表头的引用)。

我建议你阅读this chapter,这是迄今为止我发现的垃圾收集技术最清晰的解释之一。