问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

java中垃圾回收有哪几种机制?

发布网友 发布时间:2022-04-26 22:27

我来回答

2个回答

热心网友 时间:2022-04-19 02:57

强引用
在一般的Java程序中,见到最多的就是强引用(strong reference)。如Date date = new Date(),date就是一个对象的强引用。对象的强引用可以在程序中到处传递。很多情况下,会同时有多个引用指向同一个对象。强引用的存在*了对象在内存中的存活时间。假如对象A中包含了一个对象B的强引用,那么一般情况下,对象B的存活时间就不会短于对象A。如果对象A没有显式的把对象B的引用设为null的话,就只有当对象A被垃圾回收之后,对象B才不再有引用指向它,才可能获得被垃圾回收的机会。
除了强引用之外,java.lang.ref包中提供了对一个对象的不同的引用方式。JVM的垃圾回收器对于不同类型的引用有不同的处理方式。
软引用

软引用(soft reference)在强度上弱于强引用,通过类SoftReference来表示。它的作用是告诉垃圾回收器,程序中的哪些对象是不那么重要,当内存不足的时候是可以被暂时回收的。当JVM中的内存不足的时候,垃圾回收器会释放那些只被软引用所指向的对象。如果全部释放完这些对象之后,内存还不足,才会抛出OutOfMemory错误。软引用非常适合于创建缓存。当系统内存不足的时候,缓存中的内容是可以被释放的。比如考虑一个图像编辑器的程序。该程序会把图像文件的全部内容都读取到内存中,以方便进行处理。而用户也可以同时打开多个文件。当同时打开的文件过多的时候,就可能造成内存不足。如果使用软引用来指向图像文件内容的话,垃圾回收器就可以在必要的时候回收掉这些内存。
publicclass ImageData {
private String path;
private SoftReference<byte[]> dataRef;
public ImageData(String path) {
this.path = path;
dataRef = new SoftReference<byte[]>(newbyte[0]);
}
privatebyte[] readImage() {
returnnewbyte[1024 * 1024]; //省略了读取文件的操作 }
publicbyte[] getData() {
byte[] dataArray = dataRef.get();
if (dataArray == null || dataArray.length == 0) {
dataArray = readImage();
dataRef = new SoftReference<byte[]>(dataArray);
}
return dataArray;
}
}

在运行上面程序的时候,可以使用 -Xmx 参数来*JVM可用的内存。由于软引用所指向的对象可能被回收掉,在通过get方法来获取软引用所实际指向的对象的时候,总是要检查该对象是否还存活。
弱引用

弱引用(weak reference)在强度上弱于软引用,通过类WeakReference来表示。它的作用是引用一个对象,但是并不阻止该对象被回收。如果使用一个强引用的话,只要该引用存在,那么被引用的对象是不能被回收的。弱引用则没有这个问题。在垃圾回收器运行的时候,如果一个对象的所有引用都是弱引用的话,该对象会被回收。弱引用的作用在于解决强引用所带来的对象之间在存活时间上的耦合关系。弱引用最常见的用处是在集合类中,尤其在哈希表中。哈希表的接口允许使用任何Java对象作为键来使用。当一个键值对被放入到哈希表中之后,哈希表对象本身就有了对这些键和值对象的引用。如果这种引用是强引用的话,那么只要哈希表对象本身还存活,其中所包含的键和值对象是不会被回收的。如果某个存活时间很长的哈希表中包含的键值对很多,最终就有可能消耗掉JVM中全部的内存。
对于这种情况的解决办法就是使用弱引用来引用这些对象,这样哈希表中的键和值对象都能被垃圾回收。Java中提供了WeakHashMap来满足这一常见需求。
幽灵引用

在介绍幽灵引用之前,要先介绍Java提供的对象终止化机制(finalization)。在Object类里面有个finalize方法,其设计的初衷是在一个对象被真正回收之前,可以用来执行一些清理的工作。因为Java并没有提供类似C++的析构函数一样的机制,就通过 finalize方法来实现。但是问题在于垃圾回收器的运行时间是不固定的,所以这些清理工作的实际运行时间也是不能预知的。幽灵引用(phantom reference)可以解决这个问题。在创建幽灵引用PhantomReference的时候必须要指定一个引用队列。当一个对象的finalize方法已经被调用了之后,这个对象的幽灵引用会被加入到队列中。通过检查该队列里面的内容就知道一个对象是不是已经准备要被回收了。
幽灵引用及其队列的使用情况并不多见,主要用来实现比较精细的内存使用控制,这对于移动设备来说是很有意义的。程序可以在确定一个对象要被回收之后,再申请内存创建新的对象。通过这种方式可以使得程序所消耗的内存维持在一个相对较低的数量。

热心网友 时间:2022-04-19 04:15

管他几种呢。你只用保证对象任务完成后指向他的引用没有了就行,要诀是尽量缩短对象的生命周期,比如能定义方法内对象的就不要定义成类里面的对象。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
抖音弹幕怎么关掉?怎么关闭抖音弹幕? 惠普LaserJet P3005D是否支持B5纸的双面打印? word打印出图片总是缺一部分怎么办-word打印图片不完整怎么解决_百度... 理想one哪里产的车辆? 抚州抚州ONE在哪里? one地址在哪里? 如何在图片上写字(如何在图片上添加文字) 网商贷为什么钱没到账 高级经济师职称怎么评 高级经济师需要评审吗 c语言的垃圾回收机制? 如何理解.net中的垃圾回收机制 java什么是垃圾回收机制 如何理解垃圾回收(gc) win8蓝牙设置中心在哪 安卓系统的垃圾回收机制是否有问题???(非专业勿答) java的垃圾回收机制是什么? win8台式机如何用蓝牙跟手机连接 win8.1笔记本电脑蓝牙怎么开启 垃圾回收器的原理? win8系统怎么连接蓝牙 谁知道win8系统自带蓝牙驱动吗?蓝牙适配器可以自己认到吗? Win8系统怎么添加蓝牙设备 为什么苹果手机玩王者荣耀这么卡? 测试小白,面试的时候考官问怎么去测一个web端电子商务平台网站呢?用到哪些测试呢? 苹果手机还能玩王者荣耀吗?为什么打不来 车贷第一年还款本金多还是利息多 有谁知道怎么恢复以前删除的QQ聊天记录吗 请问贷款买车是要先付利息吗? itunes能备份和恢复qq聊天记录 生活中有哪些是环保的东西? 手机中的基带版本指的是什么意思? 环保的东西包括哪些? 环保设备有哪些种类,具体包括哪些方面? 智能手机里的关于手机里有个基带版本,不知道什么意思? 智能手机基带版本是什么意思? 我国有哪些环保产品? 手机基带版本 三星手机基带版本干嘛的 手机的基带版本里的字母和数字都代表着什么啊 安卓系统中的内核版本是什么意思?基带版本又是什么意思? 同一型号的手机基带版本号一样吗? 环保产品有哪些? 十大环保产品推荐! 安卓手机刷机,刷新的是什么?安卓版本?基带版本?内核版本?还是什么? 环保产品实例有哪些? 手机的基带是什么? 家庭用环保产品主要有哪些 怎样查看小米手机的基带版本 我的手机没有基带版本、出现未知、如何解决、手机没信号用不了 三星S4I9500手机的基带是什么版本