共计 947 个字符,预计需要花费 3 分钟才能阅读完成。
1. 垃圾分代回收
堆空间分为年老代、老年代,默认内存占用比例为 = 1:2 对象调配步骤为:
1.1 年老代
次要分为 Eden、From、To 三个区域,其中,默认内存占用比例为 8:1:1 存活对象进入年老代的条件:新产生的对象优先调配到老年代(除大对象,大对象会优先调配到老年代)
1.2 老年代
存活对象进入老年代的条件:
1.2.1 创立大对象(对象内存大于设定阈值)间接进入老年代
1.2.2 young gc 后,To Survivor 区不足以寄存存活对象
1.2.3 每次 young gc 后,存活对象年龄 +1。通过屡次 young gc 后,如果存活对象的年龄达到了设定阈值(默认 15),则会降职到老年代中。
1.2.4 动静年龄断定规定。
To Survivor 区中年龄从小到大的对象占据空间的累加之和,占到了 To Survivor 区一半以上的空间,那么大于等于此年龄的对象会间接进入老年代,而不须要达到默认的降职年龄。举例:年龄 1 + 年龄 2 + 年龄 3 + 年龄 N 的对象加起来的空间,大于 survivor 区域的一半,就会让年龄 N 和年龄 N 以上的对象进入老年代。动静年龄判断应该是这样子的。其中,年龄 N 是动静的,可能为 3 时达到此条件,也可能是是为 15 时,最大为 15,对象头中年龄字段大小为 4 哥字节,故最大 15。说的艰深一点:就是年龄从小到大对象的占据空间的累加和,而不是某一个特定年龄对象占据的空间。
2. 垃圾回收触发机会
2.1 young gc
年老代垃圾回收
2.1.1 Eden 区可用内存有余
2.2 full gc 所有区域垃圾回收
2.2.1 老年代达到某一阈值(默认 92%)
2.2.2 办法区可用内存有余
2.2.3 在 young gc 之前,会先查看老年代最大可用的间断空间是否大于新生代所有对象的总空间。如果小于,阐明 YGC 是不平安的,则会查看参数 HandlePromotionFailure 是否被设置成了容许担保失败,如果不容许则间接触发 Full GC;如果容许,那么会进一步查看老年代最大可用的间断空间是否大于历次降职到老年代对象的均匀大小,如果小于会触发 Full GC;大于则会执行 young gc(即便是不平安,有可能 young gc 后进入老年代的对象内存依然大于老年代可用内存,此时会报内存溢出谬误)
2.2.4 显式调用 System.gc() 或者 Runtime.gc()
正文完