垃圾收集算法

 垃圾收集

Java的一大特点就是可以进行自动垃圾回收处理。自动垃圾回收减轻了开发人员的工作量,但增加了系统的负担。

1、引用计数法

引用计数法是最经典也是最古老的一种垃圾收集方法。对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器+1,当引用失效后,引用计数器-1。只要对象A的引用计数器的值为0,则说明对象A已经不会再被使用,可以进行垃圾回收。

引用计数法的实现比较简单,只需要为美俄对象配备一个整形的计数器即可。但是引用计数器有一个严重的问题,即无法处理循环引用的情况,所以Java中没有使用引用计数法。


如图,A引用B,B引用A,A和B的引用均为1,但是除了A与B,没有其他任何对象引用A或B,则此时可认为A跟B应该进行垃圾回收。

2、标记-清除算法 

标记-清除算法是现代垃圾回收算法的思想基础。标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段。

标记阶段:

通过根节点,标记所有从根节点开始的可达对象。因此,未被标记的对象就是未被引用的垃圾对象。

清除阶段:

清除所有未被标记的垃圾对象。

标记-清除算法可能产生的最大问题就是空间碎片。

 

那么,怎么确定根节点呢?在Java中可以作为GC Roots的对象:

1、虚拟机栈(左上)的栈帧的局部变量表所引用的对象

2、本地方法栈(右中)的JNI所引用的对象

3、方法区(右下)的静态变量和常量所引用的对象

 

 回收后的空间是不连续的,在给对象分配内存时,尤其是大对象,不连续的内存空间工作效率要低于连续的内存空间。

3、复制算法

复制算法相对高效于标记-清除算法。核心思想是:将原有的内存空间分成两块,每次只使用其中一块,在垃圾回收时,将正在使用的内存中的存活对象复制到另一块未使用的内存块,清除正在使用的内存块对象。

所以当内存中的存活对象越少,所需要复制的对象也越少,算法效率越高。复制后的内存空间为连续的内存空间,所以不会产生空间碎片。复制算法使系统内存折半。

 

 Java的新生代串行垃圾回收器使用了复制算法。新生代又eden去,from区(s0),to区(s1)组成。from区和to区也成Survivor空间,即幸存者空间,用于存放未被回收的对象。from区和to区就使用到了复制算法。

复制算法比较适合用于新生代,因为新生代中的垃圾对象一般都会多余存活对象。

4、标记-压缩算法

标记-压缩算法是老年代的一种回收算法。它在标记-清除算法的基础上做了一些优化。标记-压缩法从根节点开始,对所有可达对象做标记,然后清理垃圾对象,接着将活着的对象压缩到内存一侧,避免碎片产生。


5、增量算法

 增量算法的基本思想是,如果一次性将所有的垃圾进行处理。需要造成系统长时间的停顿,那么就可以将垃圾收集线程和应用程序线程交替进行。每次垃圾收集线程至收集一小片内存空间。接着切换到应用程序线程。以此反复,直到垃圾收集完成。使用这种方式,由于在垃圾回收的过程中,间断性地还执行了应用程序代码,所以能减少系统的停顿时间。但是,因为线程切换和上下文转换的消耗,会使得垃圾收集的总体成本上升,造成系统吞吐量下降。

6、分代

分代是将内存区间根据对象的特点分成几块,根据每块内存区间的特点,使用不同的回收算法,以提高垃圾回收效率。

以HotSpot虚拟机为例,它将所有的新建对象都放入到年轻代的内存区间,年轻代的特点是对象存活率低,容易被回收。因此,年轻代可以选择效率较高的复制算法。当对象经过几次回收后依然存活,对象会被放入到老年代的内存区间,在老年代中,几乎所有的对象都是经过几次垃圾回收后依然存活的对象,因此,可以认为这些对象在一段时间,甚至在应用程序的整个生命周期中常驻内存。根据老年代的特点,可以选择标记-压缩算法以提高垃圾回收效率。



 

 

 

参考:

《Java程序性能优化  让你的Java程序更快、更稳定》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1 目标检测的定义 目标检测(Object Detection)的任务是找出图像中所有感兴趣的目标(物体),确定它们的类别和位置,是计算机视觉领域的核心问题之一。由于各类物体有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具有挑战性的问题。 目标检测任务可分为两个关键的子任务,目标定位和目标分类。首先检测图像中目标的位置(目标定位),然后给出每个目标的具体类别(目标分类)。输出结果是一个边界框(称为Bounding-box,一般形式为(x1,y1,x2,y2),表示框的左上角坐标和右下角坐标),一个置信度分数(Confidence Score),表示边界框中是否包含检测对象的概率和各个类别的概率(首先得到类别概率,经过Softmax可得到类别标签)。 1.1 Two stage方法 目前主流的基于深度学习的目标检测算法主要分为两类:Two stage和One stage。Two stage方法将目标检测过程分为两个阶段。第一个阶段是 Region Proposal 生成阶段,主要用于生成潜在的目标候选框(Bounding-box proposals)。这个阶段通常使用卷积神经网络(CNN)从输入图像中提取特征,然后通过一些技巧(如选择性搜索)来生成候选框。第二个阶段是分类和位置精修阶段,将第一个阶段生成的候选框输入到另一个 CNN 中进行分类,并根据分类结果对候选框的位置进行微调。Two stage 方法的优点是准确度较高,缺点是速度相对较慢。 常见Tow stage目标检测算法有:R-CNN系列、SPPNet等。 1.2 One stage方法 One stage方法直接利用模型提取特征值,并利用这些特征值进行目标的分类和定位,不需要生成Region Proposal。这种方法的优点是速度快,因为省略了Region Proposal生成的过程。One stage方法的缺点是准确度相对较低,因为它没有对潜在的目标进行预先筛选。 常见的One stage目标检测算法有:YOLO系列、SSD系列和RetinaNet等。 2 常见名词解释 2.1 NMS(Non-Maximum Suppression) 目标检测模型一般会给出目标的多个预测边界框,对成百上千的预测边界框都进行调整肯定是不可行的,需要对这些结果先进行一个大体的挑选。NMS称为非极大值抑制,作用是从众多预测边界框中挑选出最具代表性的结果,这样可以加快算法效率,其主要流程如下: 设定一个置信度分数阈值,将置信度分数小于阈值的直接过滤掉 将剩下框的置信度分数从大到小排序,选中值最大的框 遍历其余的框,如果和当前框的重叠面积(IOU)大于设定的阈值(一般为0.7),就将框删除(超过设定阈值,认为两个框的里面的物体属于同一个类别) 从未处理的框中继续选一个置信度分数最大的,重复上述过程,直至所有框处理完毕 2.2 IoU(Intersection over Union) 定义了两个边界框的重叠度,当预测边界框和真实边界框差异很小时,或重叠度很大时,表示模型产生的预测边界框很准确。边界框A、B的IOU计算公式为: 2.3 mAP(mean Average Precision) mAP即均值平均精度,是评估目标检测模型效果的最重要指标,这个值介于0到1之间,且越大越好。mAP是AP(Average Precision)的平均值,那么首先需要了解AP的概念。想要了解AP的概念,还要首先了解目标检测中Precision和Recall的概念。 首先我们设置置信度阈值(Confidence Threshold)和IoU阈值(一般设置为0.5,也会衡量0.75以及0.9的mAP值): 当一个预测边界框被认为是True Positive(TP)时,需要同时满足下面三个条件: Confidence Score > Confidence Threshold 预测类别匹配真实值(Ground truth)的类别 预测边界框的IoU大于设定的IoU阈值 不满足条件2或条件3,则认为是False Positive(FP)。当对应同一个真值有多个预测结果时,只有最高置信度分数的预测结果被认为是True Positive,其余被认为是False Positive。 Precision和Recall的概念如下图所示: Precision表示TP与预测边界框数量的比值 Recall表示TP与真实边界框数量的比值 改变不同的置信度阈值,可以获得多组Precision和Recall,Recall放X轴,Precision放Y轴,可以画出一个Precision-Recall曲线,简称P-R
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值