解决方案:20-垃圾回收相关算法
优采云 发布时间: 2022-12-15 23:55解决方案:20-垃圾回收相关算法
1.标记阶段 1.垃圾标记阶段 2.标记阶段算法-引用计数算法(Reference Counting)Java GC测试
public class RefCountGC {
// 5MB
private byte[] bigSize = new byte[5 * 1024 * 1024];
Object reference = null;
public static void main(String[] args) {
RefCountGC obj1 = new RefCountGC();
RefCountGC obj2 = new RefCountGC();
obj1.reference = obj2;
obj2.reference = obj1;
obj1 = null;
obj2 = null;
}
}
Heap
PSYoungGen total 38400K, used 13615K [0x0000000795580000, 0x0000000798000000, 0x00000007c0000000)
eden space 33280K, 40% used [0x0000000795580000,0x00000007962cbc00,0x0000000797600000)
from space 5120K, 0% used [0x0000000797b00000,0x0000000797b00000,0x0000000798000000)
to space 5120K, 0% used [0x0000000797600000,0x0000000797600000,0x0000000797b00000)
ParOldGen total 87552K, used 0K [0x0000000740000000, 0x0000000745580000, 0x0000000795580000)
object space 87552K, 0% used [0x0000000740000000,0x0000000740000000,0x0000000745580000)
Metaspace used 2941K, capacity 4556K, committed 4864K, reserved 1056768K
class space used 313K, capacity 392K, committed 512K, reserved 1048576K
public class RefCountGC {
// 5MB
<p>
private byte[] bigSize = new byte[5 * 1024 * 1024];
Object reference = null;
public static void main(String[] args) {
RefCountGC obj1 = new RefCountGC();
RefCountGC obj2 = new RefCountGC();
obj1.reference = obj2;
obj2.reference = obj1;
obj1 = null;
obj2 = null;
// 显示垃圾回收
System.gc();
}
}
</p>
[GC (System.gc()) [PSYoungGen: 12949K->535K(38400K)] 12949K->543K(125952K), 0.0011575 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[Full GC (System.gc()) [PSYoungGen: 535K->0K(38400K)] [ParOldGen: 8K->442K(87552K)] 543K->442K(125952K), [Metaspace: 2937K->2937K(1056768K)], 0.0249102 secs] [Times: user=0.01 sys=0.00, real=0.03 secs]
Heap
PSYoungGen total 38400K, used 998K [0x0000000795580000, 0x0000000798000000, 0x00000007c0000000)
eden space 33280K, 3% used [0x0000000795580000,0x0000000795679b20,0x0000000797600000)
from space 5120K, 0% used [0x0000000797600000,0x0000000797600000,0x0000000797b00000)
to space 5120K, 0% used [0x0000000797b00000,0x0000000797b00000,0x0000000798000000)
ParOldGen total 87552K, used 442K [0x0000000740000000, 0x0000000745580000, 0x0000000795580000)
object space 87552K, 0% used [0x0000000740000000,0x000000074006eaf8,0x0000000745580000)
Metaspace used 2943K, capacity 4556K, committed 4864K, reserved 1056768K
class space used 313K, capacity 392K, committed 512K, reserved 1048576K
Disconnected from the target VM, address: '127.0.0.1:61156', transport: 'socket'
总结 3. 标记阶段算法-可达性分析算法(Root Search Algorithm, Tracing Garbage 采集) 1. GC Roots
所谓“GC Roots”根集是一组必须处于活动状态的引用
2. GC Root收录元素
2. 本地方法栈中JNI引用的对象(通常称为本地方法)
3.方法区中类静态属性引用的对象
4.方法区常量引用的对象
5.同步锁持有的所有对象synchronized
6、反映Java虚拟机内部情况的JMXBean,注册在JVMTI中的回调,本地代码缓存等。
7、除了这些固定的GC Roots集合外,根据用户选择的垃圾采集器和当前回收的内存区域,还可以“临时”加入其他对象,组成一个完整的GC Roots集合。例如:分代采集和部分回收(Partial GC)
概括:
4、finalization机制从功能上看,finalize()方法类似于C++中的析构函数,但Java采用了基于垃圾采集器的自动内存管理机制,所以finalize()方法与C++中的finalize()方法有本质区别C++由于finalize()方法的存在,虚拟机中的对象一般有三种可能的状态。如果不能从所有根节点访问一个对象,则意味着该对象不再被使用。一般来说,这个对象是需要回收的。但其实并不是“必须死”,此时他们暂时处于“缓刑”阶段。不可触及的物体在一定条件下可能会“复活”。如果是这样,它的回收是不合理的。为此原因,定义了对象在虚拟机中的三种可能状态: 在上述三种状态中,由于finalize()方法的存在。对象只有不可触及才能被回收 判断一个对象objA是否可回收?标记可达性分析执行流程
标记-可达性分析执行流程.png
5.清关阶段
在成功区分内存中的活对象和死对象后,GC接下来的任务就是进行垃圾回收,释放无用对象占用的内存空间,以便有足够的可用内存空间为新对象分配内存。目前JVM中常见的三种垃圾回收算法分别是标记-清除算法(Mark-Sweep)、复制算法(Copying)、标记-压缩算法(Mark-Compact)
1.标记-扫描算法(Mark-Sweep)
标记清除算法(Mark-Sweep)是一种非常基础和常见的垃圾采集算法,由J.McCarthy等人提出。1960年应用于Lisp语言
注:什么是Clear 2,Mark-Copy算法
为了解决mark-sweep算法在垃圾回收效率方面的不足,MLMinsky在1963年发表了一篇著名论文《CA LISP Garbage Collector Algorithm Using Serial Secondary Storage》。MLMinsky 在这篇论文中描述的算法被称为 Copying 算法,它被 MLMinsky 自己成功地引入到 Lisp 语言的一个实现版本中。
优缺点 适用场景 3. Mark-compression(整理)算法
mark-compression算法的最终效果相当于执行完mark-sweep算法后进行一次内存碎片整理。因此,它也可以称为“标记-清除-紧凑型(Mark-Sweep-Compact)算法”。两者的本质区别在于mark-sweep算法是一种“非移动的回收算法”,而mark-compression是“移动的”。回收后是否移动幸存的物体是一个有利也有弊的冒险决定。可以看到,被标记的存活对象会根据内存地址进行排序和排列,而未标记的内存会被清理掉。这样,当我们需要为一个新对象分配内存时,JVM只需要保存一块内存的起始地址,
指针碰撞(Bump the Pointer):如果内存空间是有规律有序的分配,即已使用和未使用的内存各占一边,并维护一个记录下一次分配起点的标记指针彼此之间,当为新对象分配内存时,只需要通过修改指针的偏移量,在第一个空闲内存位置分配新对象。这种分配方式称为指针冲突。
优缺点总结
摘要.png
6.生成手机算法
在上述所有算法中,没有一种算法可以完全替代其他算法,它们都有自己独特的优缺点。一代手机算法应运而生。
在HotSpot中,基于代的概念,GC使用的内存回收算法必须结合新生代和老年代的特点。新生代(Young Gen)和老年代(Tenured Gen)分代采集算法的应用 7.增量采集算法、分区算法
通过上述算法,应用软件在垃圾回收过程中将处于Stop The World状态。在Stop The World状态下,应用的所有线程都会被挂起,暂停所有正常工作,等待垃圾回收完成。垃圾回收时间过长会导致应用长时间挂起,严重影响用户体验或系统稳定性。为了解决这个问题,对实时垃圾采集算法的研究直接导致了增量采集(Incremental Collecting)算法的诞生
增量采集算法的基本思想
解决方案:香港多IP服务器搭建采集程序的好处有哪些
香港多IP服务器设置采集方案的好处: 1.香港服务器性能强大,均为主流配置,兼容国内常见的主流采集软件市场化,配置也可以根据用户的需要进行配置调整和升级,使用方便。2.香港多IP服务器无需注册和搭建即可使用,充分简化了网站的搭建过程,减少了时间成本。3、香港多IP服务器,CN2直连网络,线路稳定,可快速抓取目标网站内容,为浏览者提供用户体验。4.由于香港的多IP服务器都是独立的真实IP,
具体内容如下:
1、性能强大
虽然采集网站采集程序的内容可以实现采集,发布全自动运行,本身需要的硬件资源也不大,但是如果采集规则比较复杂而且采集的数据量比较大的话,对服务器的压力还是不小的,所以一般如果要制作内容采集,至少需要4- E3以上核心CPU,保证相对较低的故障率,香港服务器 配置均为主流配置,不仅兼容市面上常见的主流采集软件,还可以根据用户的需求,使用起来非常方便
2. 无需备案即可使用
一般采集网站都是以站群的形式搭建为主,所以在选择服务器的时候,主要是选择海外的服务器进行备案,否则备案时间很长,上百个域名一起管理。比较麻烦,但是香港服务器数据海外服务器可以在服务器交付后立即构建网站,充分简化了构建网站的过程。
3.线路稳定采集流畅
现在采集网站主要以大陆内容为主,香港服务器搭建采集网站优势明显。香港服务器有CN2直连网络,所以在采集过程中可以快速抓取目标网站的内容,发布也可以快速响应,浏览用户的体验也比较不错。
4、丰富的IP资源
经常制作采集站点的用户都知道,所谓采集就是通过HTTP请求获取内容。虽然市面上有很多支持IP伪装的采集工具,但还是有一些可能会拒绝访问,而且由于香港的多IP服务器都是独立的真实IP,被访问的概率拦截率相对较低。