在GC回收过程中会执行referenceProcessor.process_discovered_references(),其中软引用和弱引用都会调用process_discovered_reflist(),但软引用配置了ReferencePolicy参数,而弱引用没有。因此软引用在此过程会判断当前时间截与软引用对象最近一次调用get()的时间截的差值是否大于上一次GC后堆的可用空间,如果大于软引用对象会被回收,否则不会被回收。然后软引用和弱引用都会判断分别各自回收引用集合中的引用是否存活,若存活移除集合,否则保留继续进行后续的处理。