本文目录一览

1,js的垃圾回收是用的引用计数还是标记清除

两者都是。引用计数是被动清除,标记是主动清除。var a;a = null; //给了一个清除标记,浏览器马上就会回收这个变量的内存
同问。。。

js的垃圾回收是用的引用计数还是标记清除

2,js 中垃圾回收机制能将闭包不用的变量回收吗

理论上不回收。因为闭包中的变量不会被回收这是闭包的特性之一。但是实际上不同的浏览器实现的可能不一样。一些高端浏览器如果确认这个变量没有且不会再被使用的话,也可能将其回收。找到stackoverflow上面的一个讲的相对详细的答案:http://stackoverflow.com/questions/24468713/javascript-closures-concerning-unreferenced-variables
当然是可以的再看看别人怎么说的。

js 中垃圾回收机制能将闭包不用的变量回收吗

3,JS的垃圾回收机制会回收函数声明吗

不会回收函数声明。函数声明是全局对象windows的一个属性,windows不会被销毁,所以函数声明是不会被销毁的。函数调用的时候会产生另外一个对象。那个对象再函数调用以后会被销毁。我新浪微博昵称叫”苑振哲“,以后你有什么js问题可以私信给我。
理论上不回收。因为闭包中的变量不会被回收这是闭包的特性之一。但是实际上不同的浏览器实现的可能不一样。一些高端浏览器如果确认这个变量没有且不会再被使用的话,也可能将其回收。找到stackoverflow上面的一个讲的相对详细的答案:http://stackoverflow.com/questions/24468713/javascript-closures-concerning-unreferenced-variables

JS的垃圾回收机制会回收函数声明吗

4,在JavaScript中怎样释放对象占用的内存

函数fun中定义变量e,这里的e实际上是一个dom对象,javascript判断对象是否为空 就是判断是否为 null,那么设置对象为null,也就是设置对象为空,javascript的垃圾回收机制就会自动回收e所占用的内存空间。还有一点,匿名函数永远保存着它外面的变量 这一点不是很准确,其实在javascript应用中,内部函数使用外部变量或全局变量一般通过闭包的形式,最简单的形式如下:function f1()var a=1;return function()alert(++a);} }f1();f1();至于你说的循环引用,不是很清楚你具体说的是什么?貌似javascript里没有这种概念
一个篮子,装了一些东西 这个篮子就被占用了把东西倒了 篮子空了 就可以装其他东西了 基本上就这个意思另外 js自己有垃圾回收机制 赋值为null的对象 会被清理这样 相当于这个篮子都可以丢了 放篮子这个位置也可以空出来放其他东西了

5,如何更好地优化 JavaScript 的内存回收

垃圾回收:javascript具有垃圾回收的机制,也就是说,执行环境会负责管理代码执行过程中使用的内存。其余的不多说,我们来分析一下函数中局部变量的正常生命周期。局部变量只在函数执行过程中存在。而在这个过程中,会为局部变量在栈(或堆)内存上分配相应的空间,以便存储他们的值。然后在函数中使用这些变量,直到函数结束。此时,局部变量就没有存在的必要了,因此可以释放他们所占的内存以供他们使用。现在各大浏览器通常用采用的垃圾回收有两种方法:标记清除、引用计数。下面来了解了解。 标记清除:这是javascript中最常用的垃圾回收方式。当变量进入执行环境是,就标记这个变量为“进入环境”。从逻辑上讲,永远不能释放进入环境的变量所占用的内存,因为只要执行流进入相应的环境,就可能会用到他们。当变量离开环境时,则将其标记为“离开环境”。 垃圾收集器在运行的时候会给存储在内存中的所有变量都加上标记。然后,它会去掉环境中的变量以及被环境中的变量引用的标记。而在此之后再被加上标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。最后。垃圾收集器完成内存清除工作,销毁那些带标记的值,并回收他们所占用的内存空间。 引用计数:另一种不太常见的垃圾回收策略是引用计数。引用计数的含义是跟踪记录每个值被引用的次数。当声明了一个变量并将一个引用类型赋值给该变量时,则这个值的引用次数就是1。相反,如果包含对这个值引用的变量又取得了另外一个值,则这个值的引用次数就减1。当这个引用次数变成0时,则说明没有办法再访问这个值了,因而就可以将其所占的内存空间给收回来。这样,垃圾收集器下次再运行时,它就会释放那些引用次数为0的值所占的内存。 但是用这种方法存在着一个问题,下面来看看代码: function problem(){ var objA = new Object(); var objB = new Object(); objA.someOtherObject = objB; objB.anotherObject = objA; } 在这个例子中,objA和objB通过各自的属性相互引用;也就是说这两个对象的引用次数都是2。在采用引用计数的策略中,由于函数执行之后,这两个对象都离开了作用域,函数执行完成之后,objA和objB还将会继续存在,因为他们的引用次数永远不会是0。这样的相互引用如果说很大量的存在就会导致大量的内存泄露。 我们知道,IE中有一部分对象并不是原生JavaScript对象。例如,其BOM和DOM中的对象就是使用C++以COM(Component Object Model,组件对象)对象的形式实现的,而COM对象的垃圾回收器就是采用的引用计数的策略。因此,即使IE的Javascript引擎使用标记清除的策略来实现的,但JavaScript访问的COM对象依然是基于引用计数的策略的。说白了,只要IE中涉及COM对象,就会存在循环引用的问题。看看下面的这个简单的例子: var element = document.getElementById("some_element"); var myObj = new Object(); myObj.element = element; element.someObject = myObj; 上面这个例子中,在一个DOM元素(element)与一个原生JavaScript对象(myObj)之间建立了循环引用。其中,变量myObj有一个名为element的属性指向element;而变量element有一个名为someObject的属性回指到myObj。由于循环引用,即使将例子中的DOM从页面中移除,内存也永远不会回收。 不过上面的问题也不是不能解决,我们可以手动切断他们的循环引用。 myObj.element = null; element.someObject = null; 这样写代码的话就可以解决循环引用的问题了,也就防止了内存泄露的问题。 上面讲了这么大段把JavaScript的内存回收的原理搞清楚了,现在来看看内存管理就很容易了~~~~ 内存管理:使用JavaScript编程,我们一般都不需要管内存回收的问题,如果说想要写出高水平的代码还是有点问题值得注意。一个主要问题就是分配给WEB浏览器的可用内存通常比分配给桌面应用程序要少。这样做的目的主要是出自于安全方面的考虑,目的是防止运行JavaScript的网页耗尽全部系统内存导致系统崩溃。内存限制问题不仅会影响给变量分配内存,同时还会影响调用栈以及在一个线程中能够同时执行的语句的数量。 因此,确保占用最少的内存可以让页面获得更好的性能。而优化内存占用的最佳方式,就是执行中的代码只保存必要的数据。一旦数据不在有用,最好通过将其值设置为null来释放其引用——这个做法叫解除引用。这一做法适合于大多数全局变量和局部变量的属性。局部变量会在他们离开执行环境的时候自动被解除引用,下面来看看代码: function createPerson(name){ var localPerson = new Object(); localPerson.name = name; return localPerson; } var globalPerson = createPerson("Tracy"); globalPerson = null; //手工解除引用 在这个例子中,变量globalPerson取得了createPerson()函数的返回值。在createPerson()函数内部,我们创建了一个对象并将其值赋给局部变量localPerson,然后又为局部变量添加了一个名为name 的属性。最后,当调用这个函数的时候,localPerson以函数值的形式返回并赋值给globalPerson。由于localPerson在createPerson()函数执行完毕后就离开了执行环境,因此无需我们显示地去为他们解除引用。但是对于globalPerson而言,则需要我们不使用它的时候手动为他解除引用。 不过,解除一个值的引用并不意味着自动回收该值所占的内存。解除引用的真正作用是让值脱离执行环境,以便垃圾收集器下次运行时将其回收。

6,java中的垃圾回收是什么意思

垃圾回收就是gc(gabage collection)。java比c++的优点就是多了垃圾回收机制,程序员不用去关心垃圾的回收,系统会自动调用去回收内存。一般我们想回收的时候只需要调用system.gc方法就可以了。系统会自己去调用destroy方法和其他的回收方法释放内存,节省内存空间。垃圾回收目的:Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有“作用域”的概念,只有对象的引用才有“作用域”。垃圾回收可以有效的防止内存泄露,有效的使用空闲的内存。
学过才c++,你就知道它的好处了……
比如你运行一个程序,是不是要先把程序代码放到内存里执行?执行完了,这段代码就会一直存在内存中,占用了内存的使用空间,如果是C语言的话,是要程序员在设计程序的时候用一个垃圾回收的指令把这段程序代码从内存中清理掉,但是java的话,程序员是不用再编写一个清理程序代码垃圾回收的语句的,而是由java的虚拟机垃圾回收机制自动执行,就是说,每隔一段时间java虚拟机会自动检测内存中是否存在没用的程序代码在占用内存,如果是的话就会把这些没用的或者使用过的内存中的代码清理掉,一般是说回收了垃圾所以说java程序有时候会觉得比较占内存的原因也是这个,不过因为java虚拟机有这个回收垃圾的机制,方便了程序员编写代码
垃圾收集GC(Garbage Collection)是Java语言的核心技术之一,之前我们曾专门探讨过Java 7新增的垃圾回收器G1的新特性,但在JVM的内部运行机制上看,Java的垃圾回收原理与机制并未改变。垃圾收集的目的在于清除不再使用的对象。GC通过确定对象是否被活动对象引用来确定是否收集该对象。GC首先要判断该对象是否是时候可以收集。两种常用的方法是引用计数和对象引用遍历。引用计数收集器引用计数是垃圾收集器中的早期策略。在这种方法中,堆中每个对象(不是引用)都有一个引用计数。当一个对象被创建时,且将该对象分配给一个变量,该变量计数设置为1。当任何其它变量被赋值为这个对象的引用时,计数加1(a = b,则b引用的对象+1),但当一个对象的某个引用超过了生命周期或者被设置为一个新值时,对象的引用计数减1。任何引用计数为0的对象可以被当作垃圾收集。当一个对象被垃圾收集时,它引用的任何对象计数减1。优点:引用计数收集器可以很快的执行,交织在程序运行中。对程序不被长时间打断的实时环境比较有利。缺点: 无法检测出循环引用。如父对象有一个对子对象的引用,子对象反过来引用父对象。这样,他们的引用计数永远不可能为0.跟踪收集器早期的JVM使用引用计数,现在大多数JVM采用对象引用遍历。对象引用遍历从一组对象开始,沿着整个对象图上的每条链接,递归确定可到达(reachable)的对象。如果某对象不能从这些根对象的一个(至少一个)到达,则将它作为垃圾收集。在对象遍历阶段,GC必须记住哪些对象可以到达,以便删除不可到达的对象,这称为标记(marking)对象。下一步,GC要删除不可到达的对象。删除时,有些GC只是简单的扫描堆栈,删除未标记的未标记的对象,并释放它们的内存以生成新的对象,这叫做清除(sweeping)。这种方法的问题在于内存会分成好多小段,而它们不足以用于新的对象,但是组合起来却很大。因此,许多GC可以重新组织内存中的对象,并进行压缩(compact),形成可利用的空间。为此,GC需要停止其他的活动活动。这种方法意味着所有与应用程序相关的工作停止,只有GC运行。结果,在响应期间增减了许多混杂请求。另外,更复杂的 GC不断增加或同时运行以减少或者清除应用程序的中断。有的GC使用单线程完成这项工作,有的则采用多线程以增加效率。一些常用的垃圾收集器◆标记-清除收集器这种收集器首先遍历对象图并标记可到达的对象,然后扫描堆栈以寻找未标记对象并释放它们的内存。这种收集器一般使用单线程工作并停止其他操作。并且,由于它只是清除了那些未标记的对象,而并没有对标记对象进行压缩,导致会产生大量内存碎片,从而浪费内存。◆标记-压缩收集器有时也叫标记-清除-压缩收集器,与标记-清除收集器有相同的标记阶段。在第二阶段,则把标记对象复制到堆栈的新域中以便压缩堆栈。这种收集器也停止其他操作。复制收集器这种收集器将堆栈分为两个域,常称为半空间。每次仅使用一半的空间,JVM生成的新对象则放在另一半空间中。GC运行时,它把可到达对象复制到另一半空间,从而压缩了堆栈。这种方法适用于短生存期的对象,持续复制长生存期的对象则导致效率降低。并且对于指定大小堆来说,需要两倍大小的内存,因为任何时候都只使用其中的一半。增量收集器增量收集器把堆栈分为多个域,每次仅从一个域收集垃圾,也可理解为把堆栈分成一小块一小块,每次仅对某一个块进行垃圾收集。这会造成较小的应用程序中断时间,使得用户一般不能觉察到垃圾收集器正在工作。分代收集器复制收集器的缺点是:每次收集时,所有的标记对象都要被拷贝,从而导致一些生命周期很长的对象被来回拷贝多次,消耗大量的时间。而分代收集器则可解决这个问题,分代收集器把堆栈分为两个或多个域,用以存放不同寿命的对象。JVM生成的新对象一般放在其中的某个域中。过一段时间,继续存在的对象(非短命对象)将获得使用期并转入更长寿命的域中。分代收集器对不同的域使用不同的算法以优化性能。并行收集器并行收集器使用某种传统的算法并使用多线程并行的执行它们的工作。在多CPU机器上使用多线程技术可以显著的提高java应用程序的可扩展性。最后,贴出一个非常简单的跟踪收集器的例图,以便大家加深对收集器的理解:跟踪收集器图例 使用垃圾收集器要注意的地方下面将提出一些有关垃圾收集器要注意的地方,垃圾收集器知识很多,下面只列出一部分必要的知识:◆每个对象只能调用finalize( )方法一次。如果在finalize( )方法执行时产生异常(exception),则该对象仍可以被垃圾收集器收集。◆垃圾收集器跟踪每一个对象,收集那些不可触及的对象(即该对象不再被程序引用 了),回收其占有的内存空间。但在进行垃圾收集的时候,垃圾收集器会调用该对象的finalize( )方法(如果有)。如果在finalize()方法中,又使得该对象被程序引用(俗称复活了),则该对象就变成了可触及的对象,暂时不会被垃圾收集了。但是由于每个对象只能调用一次finalize( )方法,所以每个对象也只可能 "复活 "一次。◆Java语言允许程序员为任何方法添加finalize( )方法,该方法会在垃圾收集器交换回收对象之前被调用。但不要过分依赖该方法对系统资源进行回收和再利用,因为该方法调用后的执行结果是不可预知的。◆垃圾收集器不可以被强制执行,但程序员可以通过调研System.gc方法来建议执行垃圾收集。记住,只是建议。一般不建议自己写System.gc,因为会加大垃圾收集工作量。
idlwufe 说的好

文章TAG:垃圾  垃圾回收  回收  引用  js  js的垃圾回收是用的引用计数还是标记清除  
下一篇