垃圾回收是否会使用给定代码从双向链表中删除已删除的项目?



我有一个双向链表,每个对象都有一个数据和指向下一个对象的指针,以及一个指向前一个对象的指针,如下所示:

obj1 <-> obj2 <-> obj3 <-> obj4 <->

我使用此代码删除obj3obj4:假设pobj2的数据

let b = head;
while(b.next!=null){
b=b.next
if(b.data === p){
b.next = null;}}

在这种删除方式中,指向obj3的指针丢失,因此无法访问obj3obj4,但obj3具有指向obj2的指针obj3.previous

我的问题是:如果我使用此代码删除obj3并且垃圾回收obj4会从内存中删除obj3obj4?如果是,它如何理解obj3不可访问(它会迭代链表吗?如果是,操作需要 O(n( 的时间吗?对我来说,重要的是要知道javascript垃圾收集会减慢运行时的速度。(列表太长了,需要一些时间才能迭代(

有各种垃圾收集策略可以很好地处理循环引用,其中之一是"标记和扫描"。现代发动机使用这些策略。例如,V8 也是如此。

如果我使用此代码删除 obj 3 和 obj 4,垃圾回收会从内存中删除 obj3 和 4 吗?

可以。它是否真的取决于垃圾收集器的工作方式。

如果是,它如何解决 OBJ 3 无法访问

如果它使用标记和扫描,它将遵循所有变量的所有引用并标记所有对象。然后它将遍历堆并扫描所有未标记的对象。

操作需要 O(n( 的时间吗?

是的。您使用的内存越多,垃圾回收器要执行的工作就越多。

因为我正在编写代码,对我来说重要的是 JavaScript 垃圾收集会减慢代码运行时的速度

那怎么样...实际上检查您的代码有多快以及垃圾回收获得多少时间?

相关内容

  • 没有找到相关文章

最新更新