jvm内存分配与回收策略

文章目录

  • 内存分配与回收策略
  • GC触发时机
    • minorgc触发时机
    • fullgc触发时机
  • jvm默认垃圾收集器
    • 查看当前使用的垃圾收集器
    • jdk默认垃圾收集器

内存分配与回收策略

  1. 对象优先在Eden分配
  2. 大对象直接进入老年代
  3. 长期存活的对象将进入老年代,默认15
  4. 动态对象年龄判定
    如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代
  5. 空间分配担保
    在发生Minor GC之前,虚拟机必须先检查老年代最大可用的连续空间是否大于新生代所有对象总空间,如果这个条件成立,那这一次Minor GC可以确保是安全的。如果不成立,则虚拟机会先查看-XX:HandlePromotionFailure参数的设置值是否允许担保失败(Handle PromotionFailure);如果允许,那会继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果大于,将尝试进行一次Minor GC,尽管这次Minor GC是有风险的;如果小于,或者-XX:HandlePromotionFailure设置不允许冒险,那这时就要改为进行一次Full GC。
    jdk6之后-XX:HandlePromotionFailure参数不再生效,规则变为只要老年代的连续空间大于新生代对象总大小或者历次晋升的平均大小,就会进行Minor GC,否则将进行Full GC。

GC触发时机

minorgc触发时机

  1. eden内存不足
  2. 触发fullgc时

fullgc触发时机

  1. 老年代空间不足,或者连续空间不足
    1.1 Survivor中的对象到老年代
    1.2 大对象直接到老年代
    1.3 年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小

  2. Metaspace区内存达到阈值
    从JDK8开始,永久代(PermGen)的概念被废弃掉了,取而代之的是一个称为Metaspace的存储空间。Metaspace使用的是本地内存,而不是堆内存,也就是说在默认情况下Metaspace的大小只与本地内存大小有关。-XX:MetaspaceSize=21810376B(约为20.8MB)超过这个值就会引发Full GC,这个值不是固定的,是会随着JVM的运行进行动态调整的

  3. System.gc()
    在代码中调用System.gc()方法会建议JVM进行Full GC,但是注意这只是建议,JVM执行不执行是另外一回事儿,不过在大多数情况下会增加Full GC的次数,导致系统性能下降,一般建议不要手动进行此方法的调用,可以通过-XX:+ DisableExplicitGC来禁止RMI调用System.gc。

jvm默认垃圾收集器

查看当前使用的垃圾收集器

java -XX:+PrintCommandLineFlags -version

jdk默认垃圾收集器

jdk1.7 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)

jdk1.8 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)

jdk1.9 默认垃圾收集器G1

你可能感兴趣的:(jvm,java)