zoukankan      html  css  js  c++  java
  • JVM 垃圾回收算法和对gc耗时的影响

    引用计数法 :Java虚拟机并未采用这种算法

    缺点:1.对象的循环引用 2.伴随加法和减法操作,有一定的性能开销

    -可达对象

    -不可达对象 : 通过根对象进行引用搜索

    复制算法:通常存活对象很少,这个算法效率高,也没有空间碎片,但是内存折半

    标记清除法:会产生空间碎片

    标记压缩法:老年代存活对象多,复制算法不划算,所以使用标记清除算法的优化版 , 会在标记后把存活对象压到一端。等同于标记后再进行一次碎片整理。也加标记清除压缩算法

    分代,分区的思想

    新生代使用类复制算法的思想。from和to区

    分代算法的叫法是上面算法的综合运用,使用了上面算法的各自优势。

    卡表:记录新生代对象引用在老年代是否使用,用于加快新生代的回收速度。

    分区算法:把堆分为多个不同的小区间,每个区间独立回收。减少大块堆gc的停顿时间。

    判断对象可达性的依据

    1.可触及:从根节点开始,对象可达

    2.可复活:对象引用已释放,但有可能在finalize函数中复活

    3.不可触及:对象finalize函数被调用,并且没复活,finalize只会被调用一次(不要再使用这个函数了),资源释放推荐try-catch-finally

    引用和可触及性的强度

    1.引用级别:强,软,弱,虚, 后面三种对象在一定场景下是可以被回收的

    软引用:在堆空间不足时,会被回收,所以这种不会引起内存溢出

    弱引用 :发现就被回收,取决于下一次垃圾回收的时机

    很适合保存缓存数据

    虚引用 :用于跟踪垃圾回收的过程

    STW:Stop-The-World 垃圾回收的停顿现象

    使用超大的新生代,from和to区,会导致复制算法复制大量的对象,会很大程度上延长gc的时间

    垃圾回收器

    垃圾收集算法只是理论基础,垃圾收集器才是项目中的最佳实践。

    垃圾收集器种类及参数设置

    -XX:+UseSerialGC  新生代和老年代都使用串行收集器
    ## ParNew 指定线程数量 -XX:ParallelGCThreads,默认值cpu< 8个=cpu数,大于8个(3+((5*CPU个数)/8))

    -XX:+UseParNewGC 新生代ParNew(多线程的串行收集器)收集器,老年代使用串行收集器

    ## ParallelGC注重吞吐量,支持自适应的GC调节策略
    ## 控制吞吐量的参数:-XX:MaxGCPauseMillis=最大收集停顿时间,-XX:GCTimeRatio=吞吐量 n默认=99则是使用1/(1+n)的时间来做垃圾回收
    ## -XX:UseAdaptiveSizePolicy 打开自适应GC策略
    -XX:+UseParallelGC 新声代使用parallelGC收集器,老年代使用串行收集器
    ## ParallelOldGC 作用于老年代的并行收集器,也是注重吞吐量的,jdk1.6才能使用
    -XX:+UseParallelOldGC 新生代使用ParallelGC收集器,老年代使用ParallelOldGC收集器

    ## CMS关注系统停顿时间
    ## 步骤 : 3标记 2清理 1重置
    ## 标记根对象(初始标记) -> 标记所有对象(并发标记) -> 清理前准备以及控制停顿时间(预清理) -> 修正并发标记数据(重新标记) -> 清理垃圾(并发清理) -> 重置(并发重置)
    ## 并发xx ,可以和用户线程一起执行
    -XX:-CMSPrecleaningEnabled 关闭预清理
    ## (设置的并发线程数+3)/4 = 设置4个并发线程意味着只有一个垃圾收集的并发线程
    -XX:+UseConcMarkSweepGC 新生代使用ParNew回收器,老年代使用CMS
    -XX:+CMSInitiatingOccupancyFraction 回收阀值,默认68,老年代使用率达到68%时会执行CMS回收。
    -XX:+UseCMSCompactAtFullCollection CMS会产生垃圾碎片,这个参数使用多少次CMS回收后,会进行内存压缩。
    ## CMS回收Perm区
    -XX:+CMSClassUnloadingEnabled

    ## G1回收器 Garbage-First JDK1.7
    # G1属于分代,结构上不要求各个区域连续,使用了分区算法
    ## 四个阶段 :新生代GC 并发标记周期 混合收集 FullGC
    -XX:UseG1GC 开启G1参数
    -XX:MaxGCParseMillis 最大停顿时间
    -XX:ParallelGCThreads 工作线程数量
    -XX:InitiatingHeapOccupancyPercent 比例达到比例,触发并发标记周期
    -XX:+DisableExplicitGC 禁止显示触发FullGC
    -XX:+ExplicitGCInvokesConcurrent CMS和G1在FullGC时,使用System.gc()才会并发执行
     
  • 相关阅读:
    c++ 容器学习 理论
    TCP和UDP发送数据包的大小问题
    key.go
    election.go
    watch.go
    txn.go
    sort.go
    retry.go
    op.go
    maintenance.go
  • 原文地址:https://www.cnblogs.com/fubinhnust/p/11956035.html
Copyright © 2011-2022 走看看