解决方案: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,被访问的概率拦截率相对较低。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线