垃圾回收机制
- 格式:doc
- 大小:30.50 KB
- 文档页数:5
g1垃圾回收原理
G1垃圾回收器是一种基于区域的垃圾回收器,其工作原理如下:
1. 将堆空间划分为多个相同大小的区域。
2. 在每个区域中,将存活对象和垃圾对象进行标记。
3. 对于存活对象所占用的内存空间,将其拷贝到空闲的区域中,同时更新其原始引用。
4. 最后清除所有垃圾对象,释放内存空间以供再次使用。
G1垃圾回收器相较于其他垃圾回收器具有以下优点:
1. 高效性:G1垃圾回收器能够在大堆快速清理的同时执行并发标记,可用于高吞吐量的应用程序。
2. 可预测性:由于G1垃圾回收器采用基于时间的回收方式,因此可以在固定的时间窗口内执行垃圾回收,预测性更强。
3. 可扩展性:G1垃圾回收器可以在多个处理器之间并行地进行操作,从而提高处理效率。
因此,它非常适合于多核处理器上的应用程序。
然而,G1垃圾回收器也存在一些缺点:
1. 启动时间长:由于G1垃圾回收器需要对整个堆空间进行分区,因此启动时间较长。
2. 占用内存高:G1垃圾回收器需要额外的内存来存储标记信息和回收状态信息。
在实际应用中,G1垃圾回收器广泛应用于高吞吐量的应用程序,尤其是在包含大量短期对象的应用程序中,如Java Web应用程序、大数据应用程序和游戏开发等。
通过合理配置和应用G1垃圾回收器,可以提高应用程序的性能和稳定性。
Python中的GC在计算机科学中,垃圾回收(Garbage Collection)是指自动回收不再使用的内存空间的一种机制。
在Python中也有垃圾回收机制,被称作“GC”。
Python中的GC机制涉及到Python的内存管理,特别是内存分配和释放。
Python的内存管理是高级别的,并且在默认情况下是自动执行的,这对于程序员来说非常方便。
在Python中,当创建一个对象时,Python会在内存中分配一段内存空间,以便为该对象存储数据。
当对象成为“垃圾”的时候,也就是不再需要使用时,Python会回收这段内存空间。
但是,Python的内存管理是有局限性的。
在Python中,由于使用的是动态类型赋值语言,所以对象的实例化和销毁需要大量的资源,如果没有一种高效的内存管理机制,会导致内存泄漏和性能瓶颈。
GC机制的主要目标就是保证内存的正确使用和回收。
Python中的GC机制有两种基本的形式:引用计数和标记清除。
引用计数的机制是Python中最简单、最直接和最常用的垃圾回收机制。
当一个对象被创建时,Python会给该对象附上一个计数器,指向该对象的每一个引用都会增加该计数器的值,而每一个不再需要该对象的引用,则会减少计数器的值。
当计数器为零时,Python就会自动回收该对象所占用的内存空间。
但是,引用计数机制也存在一些问题。
首先,它无法处理循环引用的情况,即两个或多个对象之间互相引用,而且这些对象都不再需要使用。
这种情况下,计数器永远不会为零,导致内存泄漏。
其次,引用计数机制的性能并不优秀,因为每一次对象引用的增加和减少都需要耗费系统资源。
因此,Python中还有标记清除机制。
标记清除机制是一种能够解决循环引用问题的垃圾回收机制。
当Python发现一个对象不再使用时,它会对该对象进行标记。
当所有对象被标记完后,Python就会进行垃圾回收,并释放被标记的对象所占用的内存空间。
而对于被标记的对象中存在循环引用的情况,Python会使用更复杂的算法解决。
2024年林场垃圾回收工作制度为切实做好我场农村“卫生清洁”工程,美化环境,减少污染,提高全场人民健康水平,改善广大居民卫生条件,共建林场清洁优美生态环境,特制定本垃圾管理及清运制度。
一、各居民点分别设置分类垃圾筒和沤肥窖,各干部职工家中应配备专用的“两桶一袋”,实行垃圾科学分类收集存放。
二、生活垃圾实行分类处理,各干部职工家中都要坚持使用专用垃圾分类桶,及时将产生的垃圾进行分类收集。
塑料、酒瓶、饮料瓶等能回收的,应收集出售给废品收集商;不可回收的垃圾(如:废旧电池等)集中投放在设置的“不可回收垃圾桶”内;其余的垃圾按有机、无机分类后,定时送到指定的地点,或由保洁员上门收集,统一处理。
严禁将垃圾沿公路、溪、河倾倒或随意丢弃、焚烧,污染环境。
三、场清洁办及各分场村民理事会负责指导和监督全场各处环境卫生工作,明确专门保洁员负责垃圾的日常收集和清运工作。
垃圾由保洁员定时进行收集,并统一运往垃圾处理工场或焚烧炉集中处理。
要有检查、有记录,生活垃圾日产日清,保证全场卫生干净清洁,无任何污染。
四、焚烧炉、分类垃圾筒及沤肥窖等卫生清洁设施若出现缺损应及时进行修复。
各分场理事会负责对各自区域内焚烧炉、分类垃圾筒及沤肥窖等卫生清洁设施进行定期清洗保养,对各户的垃圾管理情况实行____月一全面检查,并评出优秀、清洁、较清洁、不清洁。
五、保洁员要保障焚烧炉、分类垃圾筒的卫生,经常性的进行施药杀虫工作。
请全场干部职工认真遵循本垃圾回收和清运的各项准则,共同治理保护我场环境。
2024年林场垃圾回收工作制度(二)1.引言林场环境保护是林业工作的重要组成部分,垃圾回收是环境保护的关键环节。
为了提高林场垃圾回收的效率和质量,制定2024年林场垃圾回收工作制度是必要的。
本制度旨在规范林场垃圾回收工作流程,保护自然环境,提高林场垃圾处理工作的效率和质量。
2.工作目标(1) 实现垃圾零乱排放的禁止,确保林场环境的整洁和卫生。
(2) 完善林场垃圾分类体系,提高垃圾回收的效率和资源利用率。
浏览器垃圾回收机制与Vue项目内存泄漏场景分析Vue是一种流行的JavaScript框架,用于构建用户界面。
在Vue项目中,可能存在内存泄漏的情况,特别是在处理大型数据集合、频繁创建和销毁组件、使用异步操作等场景下。
一、浏览器垃圾回收机制1.标记清除:浏览器通过标记不再使用的变量,并在垃圾回收时将其清除。
每个变量会被标记为可达或不可达状态,不可达状态的变量会被回收。
2.引用计数:浏览器通过计算变量的引用数量来判断是否回收。
当变量引用数量为0时,浏览器会回收该变量所占用的内存空间。
但是,这种机制容易产生循环引用的问题。
1. 事件监听未及时解绑:在Vue项目中,如果没有及时解绑事件监听,可能导致不再使用的组件仍然保留对DOM的引用,从而导致内存泄漏。
2. 循环引用:在Vue项目中,如果存在循环引用的情况,浏览器的引用计数机制无法准确判断何时回收该变量所占用的内存空间,从而导致内存泄漏。
3. 路由切换未释放资源:在Vue项目中,如果在路由切换时未释放资源,例如未清除定时器、取消网络请求等,可能导致内存泄漏。
4. 异步操作未正确处理:在Vue项目中,如果异步操作没有正确处理,可能导致回调函数中的局部变量无法被及时回收,从而产生内存泄漏。
5. 大量数据集合处理不当:在Vue项目中,如果处理大量数据集合时不注意内存占用,可能导致内存泄漏。
例如,在v-for循环中未使用:key绑定,可能会导致频繁创建和销毁组件,造成内存泄漏。
三、避免内存泄漏的方法1. 及时解绑事件监听:在组件销毁前,使用removeEventListener(方法或Vue提供的$off(方法,将组件绑定的事件监听解绑,避免产生内存泄漏。
2. 避免循环引用:在设计数据结构时,注意避免产生循环引用的情况。
使用WeakMap等辅助工具来处理循环引用问题。
3. 在路由切换前释放资源:在路由切换前,使用Vue提供的生命周期钩子函数(例如beforeDestroy)释放资源,例如清除定时器、取消网络请求等。
垃圾回收机制垃圾回收是计算机科学中一种重要的机制,用于回收和释放程序中不再使用的内存空间,以提高系统的效率和性能。
1. 什么是垃圾回收机制?垃圾回收是一种自动化的内存管理技术,用于检测和回收程序中不再可用的内存对象。
它可以分析程序的运行时行为,识别不再被引用的对象,并将其释放以供其他程序使用。
2. 垃圾回收的优点- 减少内存泄漏:垃圾回收可以识别并回收不再使用的内存对象,从而减少内存泄漏的风险。
- 提高性能:回收不再使用的内存可以释放系统资源,提高程序的运行效率和响应速度。
- 简化编程:垃圾回收可以减少程序员手动管理内存的工作量,使编程更加简单和可靠。
3. 垃圾回收的实现方式垃圾回收机制可以通过以下几种方式来实现:- 引用计数:每个对象都维护一个引用计数器,当引用计数为零时,认为对象不再需要,可以进行回收。
- 标记-清除:通过标记所有可达对象,然后清除不可达对象来进行回收。
- 复制式垃圾回收:将内存分为两个区域,一部分为活跃对象,另一部分为闲置对象。
当活跃对象占满时,将活跃对象复制到闲置对象区域,然后清除活跃对象的内存。
- 分代式垃圾回收:根据对象的存活时间将内存分为多个代,然后对不同代进行不同的垃圾回收策略。
4. 垃圾回收的挑战垃圾回收虽然带来了许多优点,但也面临一些挑战:- 停顿时间:垃圾回收会导致程序的停顿,影响系统的实时性能。
- 资源消耗:垃圾回收需要消耗系统的资源,包括CPU和内存。
- 确定回收时机:确定内存对象是否不再使用是一个复杂的问题,需要进行准确的分析和判断。
5. 垃圾回收的最佳实践为了充分利用垃圾回收机制,以下是一些最佳实践:- 避免创建不必要的对象:尽量避免频繁创建和销毁对象,以减少垃圾的产生。
- 及时释放资源:在不再需要使用内存对象时,及时进行释放,以加快垃圾回收的速度。
- 使用合适的数据结构:选择合适的数据结构可以减少垃圾回收的复杂性和开销。
结论垃圾回收机制是一种重要的内存管理技术,可以提高系统的性能和可靠性。
垃圾回收机制的过程和原理1.什么是垃圾回收机制? 程序在创建对象或者数组等引⽤类型实体的时候,系统会在堆内存上为之分配⼀段内存区,⽤来保存这些对象,当这些对象永久地失去引⽤后,就会变成垃圾,等待系统垃圾回收机制进⾏回收。
2.垃圾回收机制的特点:垃圾回收机制只会回收堆内存中的对象,不会回收物理资源(⽹络io)垃圾回收机制是由系统控制的,程序是⽆法精准控制垃圾回收机制的时机的,程序只能指导对象什么时候不再被引⽤,当⼀个对象永久性地失去引⽤后,会由可达状态变为可恢复状态,程序会通知系统进⾏垃圾回收,但只是通知,最终是否回收是不确定的。
因为系统进⾏垃圾回收之前,会调⽤finalize()⽅法,这个⽅法可能会使对象被重新引⽤,变为可达状态,此时垃圾回收就会取消,当系统调⽤了所有finalize()⽅法后,该对象仍然是可恢复状态,也就是说此时的对象真正的失去了作⽤,这个时候该对象就会由可恢复状态转变位不可达状态,最终会被系统作为垃圾回收掉该对象所占⽤的资源。
3.什么是finalize()⽅法? finalize()⽅法时系统进⾏垃圾回收之前调⽤的⽅法。
当系统要对某个不再被引⽤的对象所占⽤的资源进⾏回收时,会要求程序调⽤适当的⽅法来进⾏资源的清理,在java中提供了默认的机制来进⾏该资源的清理,也就是finalize()⽅法;finalize()⽅法时由系统的垃圾回收机制来调⽤的,这个⽅法的调⽤会使恢复状态的对象重新被引⽤,所以它具有不确定性,最好不要⼈为的调⽤它来清理某个系统资源。
4.对象在垃圾回收机制中的状态:由三种状态:可达性、可恢复性、不可达性。
当⼀个对象被创建后,只要有⼀个以上的引⽤变量引⽤它,这个状态就处于可达状态;当⼀个对象失去了所有的引⽤之后,它就进⼊了可恢复状态,这个状态下,系统的垃圾回收机制会随时调⽤finalize()⽅法对它占⽤的资源进⾏回收,此时只要由引⽤变量引⽤对该对象,这个对象⼜变成可达状态,否则进⼊不可达状态。
垃圾回收机制 我们定义变量会申请内存空间来存放变量的值,⽽内存的容量是有限的,当⼀个变量值没有⽤了(称为垃圾),就应该将其占⽤的内存给回收掉。
变量名是访问到变量的唯⼀⽅式,所以当⼀个变量值没有任何关联的变量名时,我们就⽆法访问到该变量了,该变量就是⼀个垃圾,会被python解释的垃圾回收机制⾃动回收。
⼀、什么是垃圾回收机制 垃圾回收机制(简称GC)是python解释器⾃带的⼀种机制,专门⽤来回收不可⽤的变量值所占⽤的内存空间 ⼆、为什么要有垃圾回收机制 程序运⾏过程中会申请⼤量的内存空间,⽽对于⼀些⽆⽤的内存空间,如果不及时清理的话,会导致内存使⽤完(内存溢出),导致程序崩溃,因此,内存管理是⼀件重要且繁杂的事情,⽽python解释器⾃带的垃圾回收机制把程序员从繁杂的内存管理中解放出来。
三、垃圾回收机制原理分析 python的GC模块主要采⽤了‘引⽤计数’来跟踪和回收垃圾。
在引⽤计数的基础上,还可以通过‘标记-清除’来解决容器对象可能产⽣的循环引⽤的问题,并且通过‘分代回收’来以空间换取时间的⽅式进⼀步提⾼垃圾回收的效率。
1,引⽤计数 引⽤计数就是:变量值被变量名关联的次数 如: 引⽤计数增加 x=10(此时,变量值10的引⽤次数为1) y=x(此时,把x的内存地址给了y,此时,变量值10 的引⽤计数为2) 引⽤计数减少 x=3(此时,x和10解除关系,与3建⽴关系,变量值10的引⽤计数为1) del y(del是解除变量名y与变量值10之间的关系,变量值10的引⽤计数为0),变量值10的引⽤计数为0,其占⽤的内存空间就会被回收 2,循环引⽤ 引⽤计数机制执⾏效率问题:变量值被关联次数的增加或减少,都会引发引⽤计数机制的执⾏,这明显存在效率问题,这就是引⽤计数的⼀个软肋,但引⽤计数还存在⼀个致命弱点,即循环引⽤(也称交叉引⽤)。
# 变量名l1指向列表1,变量名l2指向列表2,如下>>> l1=['列表1中的第⼀个元素'] # 列表1被引⽤⼀次>>> l2=['列表2中的第⼀个元素'] # 列表2被引⽤⼀次>>> l1.append(l2) # 把列表2追加到l1中作为第⼆个元素,列表2的引⽤计数为2>>> l2.append(l1) # 把列表1追加到l2中作为第⼆个元素,列表1的引⽤计数为2# l1与l2del l1 #列表1的引⽤计数为1del l2 #列表2的引⽤计数为1 现在列表1和列表2都没被其他变量名关联,但引⽤计数不为0,所以不会被回收,这就是循环引⽤的危害,为解决这问题,python引进了‘标记-清除’,‘分代回收’。
如何在社区中建立垃圾分类回收体系随着城市化进程的加速和居民生活水平的提高,垃圾产生量不断增加,垃圾分类回收成为了城市管理和环境保护的重要课题。
在社区中建立有效的垃圾分类回收体系,不仅能够减少垃圾对环境的污染,还能够实现资源的回收利用,具有重要的经济和社会意义。
那么,如何在社区中建立垃圾分类回收体系呢?一、加强宣传教育,提高居民环保意识垃圾分类回收的成功实施,首先需要居民的积极参与和配合。
因此,加强宣传教育,提高居民的环保意识和垃圾分类知识水平是至关重要的。
社区可以通过多种渠道进行宣传,如在社区公告栏张贴宣传海报、发放宣传手册、举办垃圾分类知识讲座等。
宣传内容应包括垃圾分类的重要性、分类方法、回收流程等。
同时,可以利用社区微信群、公众号等新媒体平台,定期推送垃圾分类的相关知识和动态,提高宣传的覆盖面和时效性。
此外,还可以组织志愿者开展上门宣传活动,与居民面对面交流,解答他们的疑问,帮助他们养成垃圾分类的习惯。
通过持续不断的宣传教育,让垃圾分类的理念深入人心,使居民从“要我分类”转变为“我要分类”。
二、完善垃圾分类设施合理的垃圾分类设施是垃圾分类回收体系的基础。
社区应根据居民的数量和垃圾产生量,配备足够数量的分类垃圾桶。
垃圾桶的设置应遵循方便居民投放的原则,在社区的主要出入口、居民楼附近、休闲广场等人员密集的地方合理布局。
垃圾桶应明确标识可回收物、有害垃圾、厨余垃圾和其他垃圾的分类标志,便于居民准确投放。
同时,为了提高居民的分类积极性,可以在社区设置智能垃圾分类回收设备。
这些设备可以通过积分兑换等方式,鼓励居民正确分类投放垃圾。
此外,还应配备专门的垃圾运输车辆,确保分类后的垃圾能够及时清运,避免出现混装混运的情况。
三、建立监督管理机制为了确保垃圾分类回收工作的顺利进行,建立有效的监督管理机制是必不可少的。
社区可以成立垃圾分类监督小组,由社区工作人员、志愿者和居民代表组成。
监督小组定期对社区的垃圾分类情况进行检查,对不遵守分类规定的居民进行教育和劝导。
gc垃圾回收机制原理
垃圾回收(Garbage Collection,简称GC)是一种自动化的内
存管理机制,用于自动检测和释放不再被程序使用的内存空间,从而防止内存泄漏和减少程序崩溃的风险。
GC的基本原理如下:
1. 标记阶段:GC从程序的根对象(如全局变量、栈中的变量等)开始,通过追踪对象之间的引用关系,进行可达性分析。
标记所有被引用的对象,并将其记为"活动"状态。
2. 清除阶段:GC扫描整个堆内存,通过查找并删除所有未被
标记为"活动"状态的对象。
这些对象被认为是垃圾,可以安全
地被回收。
3. 压缩阶段(可选):在清除阶段之后,堆内存可能会出现大量的碎片化空间。
压缩阶段的目的是将"活动"的对象进行整理,使它们尽可能地相邻存放,以提高内存的利用率。
GC的具体实现方式包括:
1. 引用计数法:为每个对象维护一个计数器,记录有多少个引用指向该对象。
当计数器归零时,即可判定该对象为垃圾。
但是该方法无法处理循环引用的情况。
2. 可达性分析法(根搜索算法):从根对象开始,通过遍历对象之间的引用关系,标记所有可达的对象。
未被标记的对象则
被判定为垃圾。
这种方法可以处理循环引用的问题,常见的实现算法有标记-清除算法和标记-整理算法。
值得注意的是,GC的触发条件和具体运行时机是由虚拟机自行决定的,一般会根据内存使用情况、程序的执行状态等因素来判定。
同时,GC的操作会导致一定的性能开销,因此在一些特定场景下,也可以通过手动调用GC来提高程序效率。
2024年废品回收管理制度引言:随着人口的增加和经济的发展,废品产生量也在不断增加。
废品的处理问题不仅涉及环境保护,还涉及资源的回收利用。
因此,建立一套科学、高效的废品回收管理制度势在必行。
本文将以2024年废品回收管理制度为题,探索如何建立一套完善的制度,以促进废品回收的规范化和高效化。
一、制定废品回收管理法律法规要建立一个完善的废品回收管理制度,首先需要制定一系列的法律法规,对废品回收的各个环节进行规范和管理。
这些法律法规可以包括废品回收的必要程序、回收商的经营条件和资质要求、回收的目录和价格等方面的规定。
通过法律法规的制定,可以保证废品回收的合法性和规范性,避免一些不法商人和不良行为对废品回收市场的破坏。
二、建立废品回收企业的资质认证和监管机制废品回收企业是废品回收管理制度的重要组成部分。
为了保证废品回收的质量和效益,应建立废品回收企业的资质认证和监管机制。
废品回收企业必须具备一定的专业技术和设备条件,才能获得资质认证。
同时,应加强对废品回收企业的监管,定期进行抽查和检查,对不合格企业进行处罚和整改。
通过资质认证和监管机制的建立,可以提高废品回收企业的整体水平,保证废品回收的质量和安全。
三、加强废品回收的宣传和教育提高公众对废品回收的认知和意识是建立废品回收管理制度的重要环节。
应加强废品回收的宣传和教育工作,向公众普及废品回收的重要性和好处。
可以通过媒体、互联网和社区等渠道,传播废品回收的知识和技巧,引导公众参与废品回收的行动。
同时,还可以组织废品回收的培训和讲座,提高公众对废品回收的技能和能力。
通过宣传和教育工作,可以增强公众的环保意识,促进废品回收的积极参与。
四、建立废品回收的信息平台和监测系统建立废品回收的信息平台和监测系统,是实现废品回收的规范化和高效化的重要手段。
信息平台可以通过互联网和移动应用等技术手段,实现废品回收的信息化管理和流程化操作。
可以通过信息平台对废品回收的各个环节进行实时监测和管理,提高废品回收的效率和质量。
浅谈JAVA垃圾回收机制摘要:垃圾回收机制是JAVA的主要特性之一,在对垃圾回收机制进行概述之后,本文从“失去引用”和“离开作用域”这两个角度分析了JAVA程序中的对象在何种条件下满足垃圾回收的要求。
最后,本文简要介绍了垃圾回收机制的两个特性。
关键词:JAVA;垃圾回收机制;离开作用域;失去引用;自动性;不可预期性作为一种适应于Internet计算环境、面向对象并具有平台无关性的编程语言,JAVA早已确立了在IT界的地位,并因网络日益广泛的应用而变得越来越重要。
因此,在高校中JAVA也逐渐受到更多教师和学生的重视。
实际上,JAVA源自C++语言。
但JAVA语言避免了C++中晦涩的结构,成功翻越了多重继承机制的恼人问题;JAVA的垃圾回收机制显著地提高了生产率,降低了复杂度;在网络背景下使用虚拟机,以及有关安全性和动态加载的一系列设计选择,迎合了正在出现的需求和愿望。
这些特性使Java不仅成为现有程序员的武器,而且也为新的程序员创造了繁荣的市场空间。
在JAVA语言的上述特性中,本文主要分析其垃圾回收机制。
一、JAVA垃圾回收机制概述在VB、C++等某些程序设计语言中,无论是对象还是动态配置的资源或内存,都必须由程序员自行声明产生和回收,否则其中的资源将不断消耗,造成资源的浪费甚至死机。
由于要预先确定占用的内存空间是否应该被回收是非常困难的,这就导致手工回收内存往往是一项复杂而艰巨的工作。
因此,当使用这些程序设计语言编程时,程序员不仅要考虑如何实现算法以满足应用,还要花费许多精力考虑合理使用内存避免系统崩溃。
针对这种情况,JAVA语言建立了垃圾回收机制。
JAVA是纯粹的面向对象的编程语言,其程序以类为单位,程序运行期间会在内存中创建很多类的对象。
这些对象在完成任务之后,JAVA 的垃圾回收机制会自动释放这些对象所占用的空间,使回收的内存能被再次利用,提高程序的运行效率。
垃圾回收不仅可以提高系统的可靠性、使内存管理与类接口设计分离,还可以使开发者减少了跟踪内存管理错误的时间,从而把程序员从手工回收内存空间的繁重工作中解脱出来。
JAVA垃圾回收机制另一个特点是,进行垃圾回收的线程是一种低优先级的线程,在一个Java 程序的生命周期中,它只有在内存空闲的时候才有机会运行。
下面本文从“对象的失去引用”和“对象离开作用域”这两个方面进行分析,探讨JAVA程序中的对象什么时候可以被当作垃圾来进行回收。
二、对象的失去引用通过下面的一段JAVA程序(例1),我们可以讨论程序中的对象是否已经符合垃圾回收的条件。
请注意,我们只是讨论某个对象是否符合被回收的条件,这并不意味着该对象将被立即回收,关于这一点,本文后面还将进一步说明。
例1:1. class Computer{ }2. public class GarbageCollector {3. Computer makeComputer() {4. Computer tempComputer = new Computer ();5. return tempComputer;6. }7. public static void main (String args[]) {8. GarbageCollector t = new GarbageCollector ();9. Computer newComputer= t.makeComputer();10. System.out.println(“tempComputer所指向的对象可以被当作垃圾回收”);11. Computer computer1=new Computer();12. Computer computer2=new Computer();13. computer2= computer1;14. Computer computer3=new Computer();15. computer3=null;16. System.out.println(“computer3所指向的对象可以被当作垃圾回收”);17. computer1=null;18. System.out.println(“computer1所指向的对象不能被当作垃圾回收”);19. }20. }在继续讨论之前,我们首先回顾JAVA的两个基本概念——引用和对象。
引用类似于其它程序设计语言中的指针。
引用就象一个商标标签或者指示牌,它上面写着物品的名称,比如“电脑”,可是它并不是电脑。
当把这个标签贴到电脑上后,标签与电脑就联系起来,它就代表电脑了。
因此Computer computer1=new Computer();可理解为先创建一个对象的标签computer1,然后把标签贴到新创建的对象Computer上。
当创建的对象内没有任何标签指向它时,就可被当作垃圾进行回收。
电脑2computer2基于例1中的第11行~第20行,我们分析一个JAVA对象什么时候处于“失去引用”状态从而满足被回收的条件。
电脑1computer1第11行(见图1), Computer computer1=new Computer();创建了引用(标签)computer1,及对应的对象(真实的第一台电脑),可以形象地理解为把标签computer1贴在第一台电脑上。
第12行(见图2),Computer computer2=new Computer();创建了标签computer2,及对应的对象(真实的第二台电脑),并把标签computer2贴在第二台电脑上。
电脑3computer3电脑1电脑2computer1computer2第13行(见图3),computer2=computer1; 该语句的结果是使引用computer2指向computer1指向的对象。
就是说computer2原来指向的对象失去了引用,该对象会被回收。
所以,现在就有两个引用computer1和compute2指向原来computer1指向的对象。
形象地说,computer1= computer2的意思就是把computer2这个标签撕了下来贴在了computer1标签所在的电脑上,所以电脑2就没有了标签而成为垃圾,电脑1就有了两个标签。
第14行(见图4),Computer computer3=new Computer();创建了标签computer3,及对应的对象(真实的第三台电脑),并把标签computer3贴在第三台电脑上。
电脑1computer1computer2电脑3computer3第15行(见图5),computer3=null; 使引用该computer3无指向,该行相当于把computer3标签从电脑上撕了下来。
第三台电脑因为失去引用而无法访问,就成为了垃圾而被JAVA自动回收。
第17行(见图6), computer1=null; 该行相当于把computer1标签从电脑上撕了下来。
但是computer1标签所在的第一台电脑并没有成为垃圾,因为还有一个computer2标签贴在上面。
应当指出的是,虽然可以通过将对象的引用变量初始化为null值来暗示垃圾收集线程收集该对象,但此时如果该对象连接有事件监听器,那它还是不可以被收集。
所以在设一个引用变量为null值之前,应注意该引用变量指向的对象是否被监听,若有,要首先除去监听器,然后才可以赋空值。
三、对象离开作用域我们知道,在传统的面向过程语言(如C语言)中,当一个方法执行完毕,其中的局部变量就因离开了作用域而被释放;以后当该方法再次被调用时,其中的局部变量会被重新创建。
但在VB、C++等引入面向对象方法的编程语言中,其程序中基本类型的变量可以在离开作用域后被自动释放,但对象并不能被自动释放。
JAVA语言的垃圾回收线程通过自动跟踪对象的使用情况,能够使程序中的对象类似于基本类型那样在离开作用域之后被回收。
基于例1中的第1行~第10行,可以分析一个JAVA对象如何因“离开作用域”而满足被回收的条件。
临时电脑tempComputer第4行(见图7),Computer tempComputer = new tempComputer();创建了引用(标签)tempComputer,及对应的对象(真实的电脑),可以形象地理解为把标签tempComputer贴在临时电脑上。
第9行,Computer newComputer= t.makeComputer();通过调用t的方法makeComputer()来创建一个Computer的对象,并用标签把newComputer贴在该电脑上。
对象tempComputer是一个局部变量,xc在方法makeComputer结束后,系统会自动地把函数返回值作一份拷贝复制给调该方法的引用,然后对象tempComputer所被当作垃圾回收。
四、JAVA垃圾回收机制的特点前面我们讨论了JAVA程序中的对象在什么条件下满足被回收的条件,而垃圾回收线程如何回收这些“垃圾”,则遵循以下两个特性。
1.自动性。
Java技术提供了一个系统级的线程,即垃圾收集器线程,来跟踪每一块分配出去的内存空间,当Java 虚拟机处于空闲循环时,垃圾收集器线程会自动检查每一块分配出去的内存空间,然后自动回收每一块可以回收的无用的内存块。
2.不可预期性。
一个对象成为了垃圾,但是你不能断言,该对象在这行以后就立刻被清除,甚至有可能当程序结束后,该对象仍然占用内存。
像Windows这样的软件常常会出现内存不足的情况,JAVA程序很少出现就是因为可以自动回收内存。
然而,因为JAVA也不能保证及时地清除无用的对象,所以JAVA程序也会出现内存不足的情况,只是这种情况很少出现。
垃圾收集线程在一个Java程序中的执行是自动的,不能强制执行,即使程序员能明确地判断出有一块内存已经无用了,是应该回收的,程序员也不能强制垃圾收集器回收该内存块。
程序员唯一能做的就是通过调用System.gc 方法来"建议"执行垃圾收集器,但其是否可以执行,什么时候执行却都是不可知的。