您好、欢迎来到现金彩票网!
当前位置:2019欢乐棋牌 > 作用域 >

java几种垃圾收集方法和垃圾收集器

发布时间:2019-06-15 20:29 来源:未知 编辑:admin

  C标记阶段将所有需要回收的对象做标记,然后在清除阶段将所有的标记对象回收

  但是这种回收方法有很大的缺点,那就是这两个过程的的效率并不高,两个过程都是效率很低的过程

  另外一个缺点就是标记清除之后,因为之前并没有移动对象,每个标记的对象在空间的各个位置,清除

  之后会有很多不连续的内存,在遇到需要分配一个比较大的对象的时候,会出现虽然总量上有空间容纳,

  但实际上因为这些内存不连续无法分配一个连续的较大的内存给这个较大对象的情况,而导致系统再次

  复制算法是将空间分为两个大小相等的部分,每次只使用其中的一块,然后这一块用完之后就将自己里面的

  还存活着的对象复制到另一块里面去,这样的好处就是清除之后产生的内存不会出现不连续的情况,但缺点

  也很明显,那就是需要将内存缩小一半,这样看来这种代价太大,所以之后的复制算法在这上面做出改进,将

  内存分为了三个区域,一个Eden区域和两个survivor区域(大小为8/1/1,值得提醒的是这里所说的都是新生代),

  将在回收时将Eden区域和其中一个survivor中的存活的对象复制到另一个survivor中,然后将这这两个清理,

  相比于1/1的那种复制,显然这种只浪费1/10的的空间,那么这里要问了,其实我当时也提出了这样的问题,假如

  存活对象是大于survivor的,那该怎么办,书上给了解释就是需要依赖其他内存来作为担保.细节先不谈,还有就是

  这种复制算法,在存活对象比较多的情况下,比如老年代,效率自然就变低.所以产生了接下来这种算法

  这算法之前的步骤跟第一个标记清除一样,将对象一一标记,但之后不同的是不对对象进行处理,而是将存活对象向一端移动

  其实就是因地制宜思想,在新生代这种会有大量对象死去的时候,采用复制算法,因为需要复制的内存少,而在老年代

  收集算法不止一种,自然收集器也肯定不止一种,不同的收集器作用的范围不同,所采用的算法也不同

  采用的收集算法:新生代Serial采用复制算法,老年代SerialOld采用标记整理

  特点:单线程收集器,在进行收集的时候,需要暂停其他所有工作线程(Stop the world),简单高效,对于桌面应用场景(新生代使用内存不大)是很好的选择

  特点:多线程收集,关注点跟其他不同,他的目标是得到一个可以控制的吞吐量,即高效利用CPU时间,而其他则是尽可能缩短用户线程的停顿时间,即有良好的相应速度提升用户体验

  四个过程:初始标记(标记GCroot能直接关联到的对象,GC管理的主要区域是堆,所以方法区,栈,本地方法区这些不被GC管理的区域的对象一般用于做GCRoots),

  并发标记(GC root Tracing),重新标记(修正因为用户操作而标记有变动的对象的标记记录),并发清除,收集过程可以和用户线程并发执行

  缺点:-对CPU资源敏感,所以在跟用户进程并发执行的过程中会占用CPU资源导致应用程序变慢,吞吐量降低

  -无法处理浮动的垃圾,即在运行过程中产生的垃圾(收集过程中用户进程没有停止,所以垃圾还在产生)

  3,空间整合,上面所说的CMS的缺点就是空间碎片化,而G1采用整体标记整理局部复制算法的方法来使得空间的碎片化情况得到解决

  4,可预测的停顿,建立了可以预测的停顿时间的模型,能让使用者明确指定一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒返回搜狐,查看更多

http://ampguimods.com/zuoyongyu/52.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有