For investors
股价:
5.36 美元 %For investors
股价:
5.36 美元 %认真做教育 专心促就业
随着互联网的不断发展,越来越多的人都在学习达内软件编程开发等互联网课程,而本文我们就通过案例分析来简单了解一下,Java编程垃圾回收与内存泄露问题分析。
1、垃圾回收器
Node.js是一个基于V8引擎的JavaScript运行时环境,而Node.js中的垃圾回收器(GC)其实就是V8的垃圾回收器。
这么多年来,V8的垃圾回收器(GarbageCollector,简写GC)从一个全停顿(Stop-The-World),慢慢演变成了一个更加并行,并发和增量的垃圾回收器。
本节内容参考了V8团队分享的文章:Trashtalk:theOrinocogarbagecollector。
在垃圾回收中有一个重要术语:代际假说(TheGenerationalHypothesis),这个假说不仅仅适用于JavaScript,同样适用于大多数的动态语言,Java、Python等。
代际假说表明很多对象在内存中存在的时间很短,即从垃圾回收的角度来看,很多对象在分配内存空间后,很快就变得不可访问。
在V8中,会将堆分为两块不同的区域:新生代(YoungGeneration)和老生代(OldGeneration)。
新生代中存放的是生存时间短的对象,大小在1~8M之间;老生代中存放的生存时间久的对象。
对于这两块区域,V8会使用两个不同的垃圾回收器:
副垃圾回收器(Scavenger)主要负责新生代的垃圾回收。如果经过垃圾回收后,对象还存活的话,就会从新生代移动到老生代。
主垃圾回收器(FullMark-Compact)主要负责老生代的垃圾回收。
无论哪种垃圾回收器,都会有一套共同的工作流程,定期去做些任务:
标记活动对象和非活动对象,前者是还在使用的对象,后者是可以进行垃圾回收的对象。
回收或者重用被非活动对象占据的内存,就是在标记完成后,统一清理那些被标记为可回收的对象。
整理内存碎片(不连续的内存空间),这一步是可选的,因为有的垃圾回收器不会产生内存碎片。
V8为新生代采用Scavenge算法,会将内存空间划分成两个区域:对象区域(From-Space)和空闲区域(To-Space)。
副垃圾回收器在清理新生代时:
会先将所有的活动对象移动(evacuate)到连续的一块空闲内存中(这样能避免内存碎片)。
然后将两块内存空间互换,即把To-Space变成From-Space。
接着为了新生代的内存空间不被耗尽,对于两次垃圾回收后还活动的对象,会把它们移动到老生代,而不是To-Space。
后是更新引用已移动的原始对象的指针。上述几步都是交错进行,而不是在不同阶段执行。
主垃圾回收器负责老生代的清理,而在老生代中,除了新生代中晋升的对象之外,还有一些大的对象也会被分配到此处。
主垃圾回收器采用了Mark-Sweep(标记清除)和Mark-Compact(标记整理)两种算法,其中涉及三个阶段:标记(marking),清除(sweeping)和整理(compacting)。
在标记阶段,会从一组根元素开始,递归遍历这组根元素。其中根元素包括执行堆栈和全局对象,浏览器环境下的全局对象是window,Node.js环境下是global。
在清除阶段,会将非活动对象占用的内存空间添加到一个叫空闲列表的数据结构中。
在整理阶段,会让所有活动的对象都向一端移动,然后直接清理掉那一端边界以外的内存。
2、内存泄漏
内存泄漏(memoryleak)是计算机科学中的一种资源泄漏,主因是程序的内存管理失当,因而失去对一段已分配内存的控制。
程序继续占用已不再使用的内存空间,或是存储器所存储对象无法透过执行代码而访问,令内存资源空耗,简单地说就是内存无法被垃圾回收。
下面会罗列几种内存泄漏的场景:
一种是全局变量,它不会被自动回收,而是会常驻在内存中,因为它总能被垃圾回收器访问到。
二种是闭包(closure),当一个函数能够访问和操作另一个函数作用域中的变量时,就会构成一个闭包,即使另一个函数已经执行结束,但其变量仍然会被存储在内存中。
如果引用闭包的函数是一个全局变量或某个可以从根元素追溯到的对象,那么就不会被回收,以后不再使用的话,就会造成内存泄漏。
三种是事件监听,如果对某个目标重复注册同一个事件,并且没有移除,那么就会造成内存泄漏。
四种是缓存,当缓存中的对象属性越来越多时,长期存活的概率就越大,垃圾回收器也不会清理,部分不需要的对象就会造成内存泄漏。
在实际开发中,曾遇到过三种内存泄漏,如下图所示,内存一直在升。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei456学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。