zoukankan      html  css  js  c++  java
  • Java HotSpot JVM垃圾回收

    一、J2SE 5.0 HotSpot

    JVM堆内存包括:年轻代、老年代、永久代

    年轻代包括:Eden区、Survivor区

    Survivor区包括:From区、To区

    1. 年轻代GC(young gc/minor gc)

    ① Eden区存活的对象拷贝至To(From)区,清空Eden区,若To(From)区不足则直接拷贝至老年代

    ② From区存活对象拷贝至老年代,清空From(To)区

    ③ 1-2步循环From区与To区轮换执行

    2. 老年代GC(full gc/major gc)

    当老年代对象大小达到占总大小的一定比例(参数控制),进行老年代gc,清空老年代中非存活的对象

    3. 串行gc、并行gc

    串行gc:jvm默认即串行gc,也可通过参数 -XX:+UseSerialGC指定。

    并行gc:充分利用多核cpu,多线程进行gc,通过参数-XX:+UseParallelGC指定。

    并行压缩gc(Parallel Compacting Collector):基本已替代并行gc,为老年代gc使用了新算法,减少停顿时间,适用于对停顿时间有严格约束的应用。可通过参数-XX:+UseParallelOldGC指定。

    4. 标记清除gc(CMS gc)

    针对较大的堆内存情景,进一步减少停顿时间。可通过参数-XX:+UseConcMarkSweepGC 指定。

    分为如下几个阶段:

    初始标记(init mark):停顿所有线程,标识出初始存活对象的集合。耗时较短,约70ms

    ② 标记(mark):从初始标记的对象集合中标记出所有活跃的对象。耗时较长,约1.64s

    ③ 预清除(preclean):预先清除。耗时较短,约10ms

    ④ 可中断的预清除(abortable-preclean):可中断的预清除,耗时较长,约5s

    ⑤ 重标记(remark):停顿所有线程,重新标记在标记(mark)阶段中修改过的对象,获得真实的所有活跃的对象。耗时较短,约70ms

    ⑥ 交换(sweep):交换,耗时较长,约3.8s

    ⑦ 重置(reset):重置,耗时较短,约20ms

    gc时机:cms根据之前gc时机的统计而定,也根据老年代占用率阈值而定,根据参数– XX:CMSInitiatingOccupancyFraction=n,默认值为68

    增量模式:在年轻代gc之间穿插老年代gc,适用于单核或双核处理器,可通过–XX:+CMSIncrementalMode指定。

    5. 常用gc选项

    –XX:+PrintGC 打印gc信息

    –XX:+PrintGCDetails 打印gc详细信息

    -XX:+PrintHeapAtGC 打印gc时的堆大小

    –XX:+PrintGCTimeStamps 打印gc时间戳

    -XX+UseCMSCompactAtFullCollection 每次full gc时进行压缩

    -XX:CMSFullGCsBeforeCompaction=n 在n次full gc后进行压缩

    –XX:ParallelGCThreads=n 并行gc线程数

  • 相关阅读:
    十一.状态设计模式
    十. 享元设计模式
    Orcale(一)概念
    java类加载器
    spring中的事务管理机制
    spring中的annotation注解类配置
    countDownLatch和Semaphore用于多线程
    布隆过滤器
    mybatis-genator自动生成的mapper中模糊查询使用方法
    java中的异常
  • 原文地址:https://www.cnblogs.com/juzii/p/6635221.html
Copyright © 2011-2022 走看看