zoukankan      html  css  js  c++  java
  • java几种垃圾收集方法和垃圾收集器

    标记清除法:

    分为两个阶段,标记----清除

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

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

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

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

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

    触发一次GC

    复制算法:

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

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

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

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

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

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

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

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

    标记整理算法:

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

    然后清理另一边的内存,这种算法更适用于老年代

    分代收集:

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

    就采用标记清理或者标记整理

    垃圾收集器

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

    如果将作用范围划分为新生代和老年代的话:

    连线代表两者能搭配使用,所处区域代表作用范围

    依照书上画了一张简易的草图来了解这些收集器的作用范围,然后一一细说

    Serial收集器

    作用域:新生代

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

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

    缺点:在用户不可见的情况下将用户的工作线程都停掉,对其他应用造成影响

    ParNew收集器

    作用域:新生代

    算法:新生代复制算法,老年代复制整理算法

    特点:是Serial的多线程版本,其余跟Serial一样,是设置-XX:+UserConcMarksSweepGC参数默认的收集器

    通过设置jvm参数为-XX:+UserParNewGC来强制使用

    只有以上两种能与后面出现的并发收集器(CMS)同时工作

    Parallel Scavenge收集器

    作用域:新生代

    采用的收集算法:复制算法

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

    ps:吞吐量是指运行用户代码时间/(运行用户代码时间和垃圾收集时间)

    Serial Old收集器 

    作用域:老年代

    算法:标记整理算法

    特点:两大用途,一是jdk1.5之前和与ParallelScavenge一起用,另外就是作为CMS的后备方案

    Parallel Old收集器

    作用域:老年代

    特点:注重吞吐量和CPU资源

    CMS收集器(ConcurrentMarkSweep)

    作用域:老年代

    算法:标记清除算法

    特点:以获取最短回收停顿时间为目标

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

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

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

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

    -标记清除,会造成空间碎片化,在大的对象产生时候内存分配会遇到麻烦

    G1收集器

    作用域:

    算法:整体标记整理局部复制算法

    特点:四大特点:

    1,并行与并发,G1能利用多CPU多核心的硬件优势,来缩短STW的时间

    2,分代收集

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

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

    感觉这部分知识还需要慢慢啃,一下子搬上来概念或者概述也没啥用...

  • 相关阅读:
    jsp页面跳转的路径问题
    Hibernate简单的保存操作
    Hibernate中如何完成持久化类和数据库映射文件
    spring中IOC的简单使用
    对称的二叉树 --剑指offer
    二叉树的下一个结点 --剑指offer
    删除链表中重复的结点 --剑指offer
    链表中环的入口结点 --剑指offer
    字符流中第一个不重复的字符 --剑指offer
    表示数值的字符串 --剑指offer
  • 原文地址:https://www.cnblogs.com/Yintianhao/p/10127358.html
Copyright © 2011-2022 走看看