R大部分文章整理

整理rednaxelafx.iteye.com上适合的内容


  • 手动System.gc()与JVM自动gc有什么根本上的区别么?
    • System.gc()可能在自动GC原本不会进入GC的位置上进入GC
      • 正常情况下,Java代码要尝试在GC堆上分配空间的时候才会触发GC;换句话说,基本上是“new”的时候才会触发GC。但System.gc()、JVMTI的强制GC等动作都在正常情况之外提示系统要做一次GC
    • System.gc()不一定是触发所谓的“full GC”或者叫“major GC”
      • 在Sun JDK6与OpenJDK 6的HotSpot里,"GCCause是_java_lang_system_gc"的时候,如果VM启动参数DisableExplicitGC为false,则会触发一次full GC,如果该参数为true则完全不触发任何GC。要将这个参数设置为true,启动的时候写上-XX:+DisableExplicitGC就行
      • 当使用Concurrent Mark-Sweep (CMS)时,可以通过-XX:+ExplicitGCInvokesConcurrent 或 -XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses 参数来指定System.gc()触发并发GC而不是full GC
        在CMS中,并发GC不对old gen做压缩,而full GC是stop-the-world的并且会做压缩
    • HotSpot对System.gc()有特别处理
      • 最主要的地方体现在一次System.gc()是否与普通GC一样会触发GC的统计/阈值数据的更新
        • HotSpot里的许多GC算法都带有自适应的功能,会根据先前收集的效率来决定接下来的GC中使用的参数,
          但System.gc()默认不更新这些统计数据,避免用户强行调用GC对这些自适应功能的干扰
          可以参考HotSpot的UseAdaptiveSizePolicyWithSystemGC参数,默认是false
    • 除此之外,在HotSpot里,System.gc()所触发的full GC跟普通的full GC没啥大差别

整理rednaxelafx.zhihu.com上适合的内容



最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • System.gc整理 System.gc()源码public static void gc() { Runtim...
    andersonoy阅读 2,986评论 0 1
  • Java 虚拟机有自己完善的硬件架构, 如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM 屏蔽了与具体操作系...
    尹小凯阅读 1,707评论 0 10
  • 原文阅读 前言 这段时间懈怠了,罪过! 最近看到有同事也开始用上了微信公众号写博客了,挺好的~给他们点赞,这博客我...
    码农戏码阅读 6,027评论 2 31
  • 一 、java虚拟机底层结构详解 我们知道,一个JVM实例的行为不光是它自己的事,还涉及到它的子系统、存储区域、...
    葡萄喃喃呓语阅读 1,527评论 0 4
  • Troubleshooting 整理 kill -3 pid发送一个SIGQUIT信号给Java应用, 通常会有当...
    andersonoy阅读 725评论 0 0