gc初步了解2

年轻代,老年代,永久代(Metaspace )存放什么对象?
  • heap包含年轻代和老年代,永久代是另一块内存;
  • 年轻代用来存放新近创建的对象,对象更新速度快,在短时间内产生大量的“死亡对象”
  • 老年代是从年轻代Survivor 区域中熬过来的对象或者大对象,fullgc时清理;
  • 永久代存放class信息、常量、静态变量等数据,fullgc时清理;
CMS和G1收集器的区别?
  • CMS(Concurrent Mark and Sweep)是以牺牲吞吐量为代价来获得最短停顿时间的垃圾回收器,主要适用于对响应时间的侧重性大于吞吐量的场景。仅针对老年代(Tenured Generation)的回收。
    1. 为求达到该目标主要是因为以下两个原因:
      i. 没有采取compact操作,而是简单的mark and sweep,同时维护了一个free list来管理内存空间,所以也产生了大量的内存碎片。
      ii. mark and sweep分为多个阶段,其中大部分的阶段的GC线程是和用户线程并发执行,默认的GC线程数为物理CPU核心数的1/4。
    2. gc参数
    -XX:+UseConcMarkSweepGC - 启用CMS,同时-XX:+UseParNewGC会被自动打开
    -XX:CMSInitiatingOccupancyFraction - 设置第一次启动CMS的阈值,默认是68%
    -XX:+UseCMSInitiatingOccupancyOnly - 只是用设定的回收阈值,如果不指定,JVM仅在第一次使用设定值,后续则自动调整
    -XX:+CMSPermGenSweepingEnabled - 回收perm区
    -XX:+CMSConcurrentMTEnabled 默认为true。
    -XX:+UseCMSCompactAtFullCollection 默认为true。
    -XX:+CMSFullGCsBeforeCompaction 默认是0
    -XX:+CMSParallelRemarkEnabled 默认为ture
    -XX:+CMSScavengeBeforeRemark 强制remark之前开始一次minor GC默认为false
    
  • G1收集器(或者垃圾优先收集器)的设计初衷是为了尽量缩短处理超大堆时产生的停顿。在回收的时候将对象从一个小堆区复制到另一个小堆区,这意味着G1在回收垃圾的时候同时完成了堆的部分内存压缩,相对于CMS的优势而言就是内存碎片的产生率大大降低。
    1. gc参数
    -XX:+UseG1GC 启用G1垃圾收集器
    -XX:MaxGCPauseMillis=n 指定期望的最大停顿时间
    -XX:G1HeapRegionSize=n 设置的 G1 区域的大小,值是 2 的幂
    -XX:ParallelGCThreads=n 设置 STW 工作线程数的值。将 n 的值设置为逻辑处理器的数量
    -XX:ConcGCThreads=n 设置并行标记的线程数。将 n 设置为并行垃圾回收线程数 
    -XX:InitiatingHeapOccupancyPercent=45 设置触发标记周期的 Java 堆占用率阈值。默认占用率是整个 Java 堆的 45%
    -XX:G1ReservePercent=n 设置堆内存保留为假天花板的总量
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容