课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
随着互联网的不断发展,越来越多的人都在学习计算机编程开发技术,而今天我们就通过案例分析来了解一下,java编程开发垃圾收集知识分享。
垃圾收集器主要做的三件事:哪些内存需要回收、什么时候回收、怎么回收。
而从垃圾收集器的诞生到现在有半个世纪的发展,现在的内存动态分配和内存回收技术已经非常成熟,一切看起来都进入了“自动化”。但在某些时候还是需要我们去监测在高并发的场景下,是否有内存溢出、泄漏、GC时间过程等问题。所以在了解和知晓垃圾收集的相关知识对于高级程序员的成长就非常重要。
垃圾收集器的核心知识项主要包括:判断对象是否存活、垃圾收集算法、各类垃圾收集器以及垃圾回收过程。
引用计数器
为每一个对象添加一个引用计数器,统计指向该对象的引用次数。
当一个对象有相应的引用更新操作时,则对目标对象的引用计数器进行增减。
一旦当某个对象的引用计数器为0时,则表示此对象已经死亡,可以被垃圾回收。
可达性分析法
Java、C#等主流语言的内存管理子系统,都是通过可达性分析(ReachabilityAnalysis)算法来判定对象是否存活的。
它的算法思路是通过定义一系列称为GCRoots根对象作为起始节点集,从这些节点出发,穷举该集合引用到的全部对象填充到该集合中(liveset)。这个过程教过标记,只标记那些存活的对象好,那么现在未被标记的对象就是可以被回收的对象了。
标记-清除算法(mark-sweep)
标记无引用的死亡对象所占据的空闲内存,并记录到空闲列表中(freelist)。
当需要创建新对象时,内存管理模块会从freelist中寻找空闲内存,分配给新建的对象。
这种清理方式其实非常简单高效,但是也有一个问题内存碎片化太严重了。
Java虚拟机的堆中对象,必须是连续分布的,所以极端的情况下可能即使总剩余内存充足,但寻找连续内存分配效率低,或者严重到无法分配内存。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。