1、概述

垃圾收集( Garbage collection, GC )

  • 哪些内存需要回收?
  • 什么时候回收?
  • 如何回收?

内存的动态分配和内存回收技术已经相当成熟了,一切看起来都进入了 “自动化” 时代,为什么还要了解GC ?
当需要排查各种内存溢出,内存泄漏问题时,垃圾回收称为达到更高并发量的瓶颈时,我们就需要对垃圾回收进行监控和调节。
程序计数器、虚拟机栈、本地方法栈三个区域随线程而生,随线程而灭,在这几个区域内不需要过多的考虑回收的问题,因为方法结束或者线程结束时,内存就随之回收了。
java堆和方法区则不一样,一个接口中的多个实现类需要的内存可能不一样,一个方法中的多个分支需要的内存也可能不一样,只有在程序运行期间才能知道会创建哪些对象。这部分内存的分配和回收都是动态的。

2、对象已死?

堆里几乎存放着java中所有的实例对象,在对堆进行回收前,第一件事情就是要确定这些对象有哪些还 “存活” 着 ?哪些已经 “死去” (不可能再被任何途径使用的对象)。

2.1 引用计数算法

给对象中增加一个引用计数器,每当一个地方引用它时,计数器值就加1;当引用失效,计数器值就建1;计算器为0的对象就是不可能再被使用的。
引用计数算法的实现简单,判断效率也很高,但是它很难解决对象之间的相互循环引用的问题。所以Java没有选用引用计数算法来管理内存。
eg

  1. package **;
  2. /**
  3. * @author hll
  4. * @date 2019/8/19.
  5. */
  6. public class Gc {
  7. public Object instance = null;
  8. private static final int _1M = 1024 * 1024;
  9. private byte [] bigSize = new byte[2 * _1M];
  10. public static void testGc() {
  11. Gc gc1 = new Gc();
  12. Gc gc2 = new Gc();
  13. gc1.instance = gc2;
  14. gc2.instance= gc1;
  15. gc1 = null;
  16. gc2 = null;
  17. System.gc();
  18. }
  19. public static void main(String[] args) {
  20. testGc();
  21. }
  22. }

打印结果:

  1. D:\java\jdk1.8.0_211\bin\java -XX:+PrintGCDetails "-javaagent:D:\IntelliJ IDEA2017.1.2\lib\idea_rt.jar=56990:D:\IntelliJ IDEA2017.1.2\bin" -Dfile.encoding=UTF-8 -classpath D:\java\jdk1.8.0_211\jre\lib\charsets.jar;D:\java\jdk1.8.0_211\jre\lib\deploy.jar;D:\java\jdk1.8.0_211\jre\lib\ext\access-bridge-64.jar;D:\java\jdk1.8.0_211\jre\lib\ext\cldrdata.jar;D:\java\jdk1.8.0_211\jre\lib\ext\dnsns.jar;D:\java\jdk1.8.0_211\jre\lib\ext\jaccess.jar;D:\java\jdk1.8.0_211\jre\lib\ext\jfxrt.jar;D:\java\jdk1.8.0_211\jre\lib\ext\localedata.jar;D:\java\jdk1.8.0_211\jre\lib\ext\nashorn.jar;D:\java\jdk1.8.0_211\jre\lib\ext\sunec.jar;D:\java\jdk1.8.0_211\jre\lib\ext\sunjce_provider.jar;D:\java\jdk1.8.0_211\jre\lib\ext\sunmscapi.jar;D:\java\jdk1.8.0_211\jre\lib\ext\sunpkcs11.jar;D:\java\jdk1.8.0_211\jre\lib\ext\zipfs.jar;D:\java\jdk1.8.0_211\jre\lib\javaws.jar;D:\java\jdk1.8.0_211\jre\lib\jce.jar;D:\java\jdk1.8.0_211\jre\lib\jfr.jar;D:\java\jdk1.8.0_211\jre\lib\jfxswt.jar;D:\java\jdk1.8.0_211\jre\lib\jsse.jar;D:\java\jdk1.8.0_211\jre\lib\management-agent.jar;D:\java\jdk1.8.0_211\jre\lib\plugin.jar;D:\java\jdk1.8.0_211\jre\lib\resources.jar;D:\java\jdk1.8.0_211\jre\lib\rt.jar;D:\workSpace\miniapp-common-biz\miniapp-common-biz-service\target\classes;C:\Users\wb-hll364276\.m2\repository\com\alios\miniapp\miniapp-common-utils\1.0.0-SNAPSHOT\miniapp-common-utils-1.0.0-20190801.101656-39.jar;C:\Users\wb-hll364276\.m2\repository\com\esotericsoftware\reflectasm\reflectasm\1.09\reflectasm-1.09.jar;C:\Users\wb-hll364276\.m2\repository\org\ow2\asm\asm\4.0\asm-4.0.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\reactive\reactive-ext\1.1.2\reactive-ext-1.1.2.jar;C:\Users\wb-hll364276\.m2\repository\io\reactivex\rxjava2\rxjava\2.1.16\rxjava-2.1.16.jar;C:\Users\wb-hll364276\.m2\repository\org\reactivestreams\reactive-streams\1.0.2\reactive-streams-1.0.2.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\reactive\reactive-pipeline\1.1.2\reactive-pipeline-1.1.2.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\reactive\pipeline-api\999-not-exist\pipeline-api-999-not-exist.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\transmittable-thread-local\2.5.0\transmittable-thread-local-2.5.0.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\ajdk\ajdk-api\8.4.7-0-1\ajdk-api-8.4.7-0-1.jar;C:\Users\wb-hll364276\.m2\repository\org\apache\httpcomponents\httpasyncclient\4.1.4\httpasyncclient-4.1.4.jar;C:\Users\wb-hll364276\.m2\repository\org\apache\httpcomponents\httpcore-nio\4.4.10\httpcore-nio-4.4.10.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\rdb\rdb-client2\2.2.3\rdb-client2-2.2.3.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\middleware\logger.api\0.2.5\logger.api-0.2.5.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\middleware\logger.core\0.2.5\logger.core-0.2.5.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\middleware\logger.pandolet\0.2.5\logger.pandolet-0.2.5.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\diamond\diamond-client\3.7.8\diamond-client-3.7.8.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\diamond\diamond-utils\3.2.0\diamond-utils-3.2.0.jar;C:\Users\wb-hll364276\.m2\repository\org\codehaus\jackson\jackson-mapper-lgpl\1.9.6\jackson-mapper-lgpl-1.9.6.jar;C:\Users\wb-hll364276\.m2\repository\org\codehaus\jackson\jackson-core-lgpl\1.9.6\jackson-core-lgpl-1.9.6.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\metrics-core-api\1.0.0\metrics-core-api-1.0.0.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\vipserver\vipserver-client\4.6.2\vipserver-client-4.6.2.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\eagleeye\eagleeye-core\1.5.2.1\eagleeye-core-1.5.2.1.jar;C:\Users\wb-hll364276\.m2\repository\javax\servlet\javax.servlet-api\3.1.0\javax.servlet-api-3.1.0.jar;C:\Users\wb-hll364276\.m2\repository\cglib\cglib-nodep\3.2.4\cglib-nodep-3.2.4.jar;C:\Users\wb-hll364276\.m2\repository\io\netty\netty-all\4.0.56.Final\netty-all-4.0.56.Final.jar;D:\workSpace\miniapp-common-biz\miniapp-common-biz-client\target\classes;C:\Users\wb-hll364276\.m2\repository\com\alios\miniapp\miniapp-common-client\1.0.0-SNAPSHOT\miniapp-common-client-1.0.0-20190801.101649-65.jar;C:\Users\wb-hll364276\.m2\repository\org\projectlombok\lombok\1.18.8\lombok-1.18.8.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\fastvalidator\fastvalidator-spring-boot-starter\2.5.5.0\fastvalidator-spring-boot-starter-2.5.5.0.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\fastvalidator\fastvalidator-core\2.5.5.0\fastvalidator-core-2.5.5.0.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\fastvalidator\fastvalidator-generator\2.5.5.0\fastvalidator-generator-2.5.5.0.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\fastvalidator\fastvalidator-constraints\2.5.5.0\fastvalidator-constraints-2.5.5.0.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\fastvalidator\fastvalidator-logger\2.5.5.0\fastvalidator-logger-2.5.5.0.jar;C:\Users\wb-hll364276\.m2\repository\javax\validation\validation-api\1.1.0.Final\validation-api-1.1.0.Final.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\fastvalidator\fastvalidator-jsr\2.5.5.0\fastvalidator-jsr-2.5.5.0.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\fastvalidator\fastvalidator-meta\2.5.5.0\fastvalidator-meta-2.5.5.0.jar;C:\Users\wb-hll364276\.m2\repository\org\springframework\boot\spring-boot-starter-actuator\1.5.20.RELEASE\spring-boot-starter-actuator-1.5.20.RELEASE.jar;C:\Users\wb-hll364276\.m2\repository\org\springframework\boot\spring-boot-actuator\1.5.20.RELEASE\spring-boot-actuator-1.5.20.RELEASE.jar;C:\Users\wb-hll364276\.m2\repository\org\springframework\boot\spring-boot-starter-aop\1.5.20.RELEASE\spring-boot-starter-aop-1.5.20.RELEASE.jar;C:\Users\wb-hll364276\.m2\repository\org\springframework\spring-aop\4.3.23.RELEASE\spring-aop-4.3.23.RELEASE.jar;C:\Users\wb-hll364276\.m2\repository\org\aspectj\aspectjweaver\1.8.14\aspectjweaver-1.8.14.jar;C:\Users\wb-hll364276\.m2\repository\org\springframework\spring-core\4.3.23.RELEASE\spring-core-4.3.23.RELEASE.jar;C:\Users\wb-hll364276\.m2\repository\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;C:\Users\wb-hll364276\.m2\repository\org\springframework\spring-context\4.3.23.RELEASE\spring-context-4.3.23.RELEASE.jar;C:\Users\wb-hll364276\.m2\repository\org\springframework\spring-expression\4.3.23.RELEASE\spring-expression-4.3.23.RELEASE.jar;C:\Users\wb-hll364276\.m2\repository\org\springframework\boot\spring-boot-configuration-processor\1.5.20.RELEASE\spring-boot-configuration-processor-1.5.20.RELEASE.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\boot\pandora-tddl-spring-boot-starter\2019-04-stable\pandora-tddl-spring-boot-starter-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\pandora-boot-starter-tddl\2019-04-stable\pandora-boot-starter-tddl-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\pandora-boot-starter\2019-04-stable\pandora-boot-starter-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\pandora-boot-bootstrap\2.1.11.3\pandora-boot-bootstrap-2.1.11.3.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\pandora-boot-loader\2.1.11.3\pandora-boot-loader-2.1.11.3.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\pandora-boot-version\2.1.11.3\pandora-boot-version-2.1.11.3.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\pandora.archive\2.1.11\pandora.archive-2.1.11.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\pandora-boot-autoconf\2.1.11.3\pandora-boot-autoconf-2.1.11.3.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\pandora-boot-bootstrap-springboot2\2.1.11.3\pandora-boot-bootstrap-springboot2-2.1.11.3.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\taobao-hsf.sar-container\2019-04-stable\taobao-hsf.sar-container-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\plugin\metrics\2.0.2\metrics-2.0.2.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\plugin\pandolet\1.0.2\pandolet-1.0.2.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\plugin\pandora-qos-service\2.1.6.7\pandora-qos-service-2.1.6.7.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\plugin\tddl-client\5.2.8\tddl-client-5.2.8.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\plugin\unitrouter\1.2.3\unitrouter-1.2.3.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\plugin\diamond-client\3.8.15\diamond-client-3.8.15.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\plugin\eagleeye-core\1.8.1.2\eagleeye-core-1.8.1.2.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\plugin\vipserver-client\4.8.0\vipserver-client-4.8.0.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\plugin\dpath\1.5\dpath-1.5.jar;C:\Users\wb-hll364276\.m2\repository\org\springframework\boot\spring-boot-starter\1.5.20.RELEASE\spring-boot-starter-1.5.20.RELEASE.jar;C:\Users\wb-hll364276\.m2\repository\org\springframework\boot\spring-boot\1.5.20.RELEASE\spring-boot-1.5.20.RELEASE.jar;C:\Users\wb-hll364276\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\1.5.20.RELEASE\spring-boot-autoconfigure-1.5.20.RELEASE.jar;C:\Users\wb-hll364276\.m2\repository\org\springframework\boot\spring-boot-starter-logging\1.5.20.RELEASE\spring-boot-starter-logging-1.5.20.RELEASE.jar;C:\Users\wb-hll364276\.m2\repository\ch\qos\logback\logback-classic\1.1.11\logback-classic-1.1.11.jar;C:\Users\wb-hll364276\.m2\repository\ch\qos\logback\logback-core\1.1.11\logback-core-1.1.11.jar;C:\Users\wb-hll364276\.m2\repository\org\slf4j\jul-to-slf4j\1.7.26\jul-to-slf4j-1.7.26.jar;C:\Users\wb-hll364276\.m2\repository\org\slf4j\log4j-over-slf4j\1.7.26\log4j-over-slf4j-1.7.26.jar;C:\Users\wb-hll364276\.m2\repository\org\yaml\snakeyaml\1.17\snakeyaml-1.17.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\boot\pandora-tddl-spring-boot-autoconfigure\2019-04-stable\pandora-tddl-spring-boot-autoconfigure-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\boot\spring-boot-alibaba-context\2019-04-stable\spring-boot-alibaba-context-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\org\apache\commons\commons-lang3\3.5\commons-lang3-3.5.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\sdk\2019-04-stable\sdk-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\spas-sdk-service-sdk\1.3.0--2019-04-stable\spas-sdk-service-sdk-1.3.0--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\metrics-sdk\2.0.2--2019-04-stable\metrics-sdk-2.0.2--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\vipserver-client-sdk\4.8.0--2019-04-stable\vipserver-client-sdk-4.8.0--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\monitor-sdk\1.2.12--2019-04-stable\monitor-sdk-1.2.12--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\acl.plugin-sdk\2.2.02--2019-04-stable\acl.plugin-sdk-2.2.02--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\notify-tr-client-sdk\5.0.3--2019-04-stable\notify-tr-client-sdk-5.0.3--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\spas-sdk-client-sdk\1.3.0--2019-04-stable\spas-sdk-client-sdk-1.3.0--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\config-client-sdk\2.0.5--2019-04-stable\config-client-sdk-2.0.5--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\filesync-client-sdk\1.0.10--2019-04-stable\filesync-client-sdk-1.0.10--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\tddl-client-sdk\5.2.8--2019-04-stable\tddl-client-sdk-5.2.8--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\tbsession-sdk\3.1.4.7--2019-04-stable\tbsession-sdk-3.1.4.7--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\hsf-notify-client-sdk\3.2.2--2019-04-stable\hsf-notify-client-sdk-3.2.2--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\diamond-client-sdk\3.8.15--2019-04-stable\diamond-client-sdk-3.8.15--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\pandora-qos-service-sdk\2.1.6.7--2019-04-stable\pandora-qos-service-sdk-2.1.6.7--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\ons-sdk-sdk\1.8.0-EagleEye--2019-04-stable\ons-sdk-sdk-1.8.0-EagleEye--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\tair-plugin-sdk\4.1.6--2019-04-stable\tair-plugin-sdk-4.1.6--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\rocketmq-client-sdk\4.3.5--2019-04-stable\rocketmq-client-sdk-4.3.5--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\switch-sdk\2.1.1.1--2019-04-stable\switch-sdk-2.1.1.1--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\buc.sso.client.plugin-sdk\0.9.12--2019-04-stable\buc.sso.client.plugin-sdk-0.9.12--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\eagleeye-core-sdk\1.8.1.2--2019-04-stable\eagleeye-core-sdk-1.8.1.2--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\pandora-framework-sdk\2.1.8.1--2019-04-stable\pandora-framework-sdk-2.1.8.1--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\alimonitor-jmonitor-sdk\1.2.6--2019-04-stable\alimonitor-jmonitor-sdk-1.2.6--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\pandolet-sdk\1.0.2--2019-04-stable\pandolet-sdk-1.0.2--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\hsf-sdk\2.2.7.8-BUGFIX--2019-04-stable\hsf-sdk-2.2.7.8-BUGFIX--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\metaq-client-sdk\4.2.6.Final--2019-04-stable\metaq-client-sdk-4.2.6.Final--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\mtop-uncenter-sdk\1.0.5.3--2019-04-stable\mtop-uncenter-sdk-1.0.5.3--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\unitrouter-sdk\1.2.3--2019-04-stable\unitrouter-sdk-1.2.3--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\boot\pandora-tddl-spring-boot-autoconfigure2\2019-04-stable\pandora-tddl-spring-boot-autoconfigure2-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\org\springframework\spring-jcl\999-not-exist-SNAPSHOT\spring-jcl-999-not-exist-20180308.110450-1.jar;C:\Users\wb-hll364276\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\1.5.20.RELEASE\spring-boot-starter-jdbc-1.5.20.RELEASE.jar;C:\Users\wb-hll364276\.m2\repository\org\apache\tomcat\tomcat-jdbc\8.5.39\tomcat-jdbc-8.5.39.jar;C:\Users\wb-hll364276\.m2\repository\org\apache\tomcat\tomcat-juli\8.5.39\tomcat-juli-8.5.39.jar;C:\Users\wb-hll364276\.m2\repository\org\springframework\spring-jdbc\4.3.23.RELEASE\spring-jdbc-4.3.23.RELEASE.jar;C:\Users\wb-hll364276\.m2\repository\org\springframework\spring-beans\4.3.23.RELEASE\spring-beans-4.3.23.RELEASE.jar;C:\Users\wb-hll364276\.m2\repository\org\springframework\spring-tx\4.3.23.RELEASE\spring-tx-4.3.23.RELEASE.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\boot\pandora-diamond-spring-boot-starter\2019-04-stable\pandora-diamond-spring-boot-starter-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\pandora-boot-starter-diamond\2019-04-stable\pandora-boot-starter-diamond-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\boot\spring-boot-alibaba-diamond-autoconfigure\2019-04-stable\spring-boot-alibaba-diamond-autoconfigure-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\boot\spring-boot-alibaba-diamond-autoconfigure2\2019-04-stable\spring-boot-alibaba-diamond-autoconfigure2-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\org\codehaus\groovy\groovy-all\2.4.16\groovy-all-2.4.16.jar;C:\Users\wb-hll364276\.m2\repository\org\mybatis\spring\boot\mybatis-spring-boot-starter\1.1.1\mybatis-spring-boot-starter-1.1.1.jar;C:\Users\wb-hll364276\.m2\repository\org\mybatis\spring\boot\mybatis-spring-boot-autoconfigure\1.1.1\mybatis-spring-boot-autoconfigure-1.1.1.jar;C:\Users\wb-hll364276\.m2\repository\org\mybatis\mybatis\3.4.0\mybatis-3.4.0.jar;C:\Users\wb-hll364276\.m2\repository\org\mybatis\mybatis-spring\1.3.0\mybatis-spring-1.3.0.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\boot\pandora-hsf-spring-boot-starter\2019-04-stable\pandora-hsf-spring-boot-starter-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\pandora-boot-starter-hsf\2019-04-stable\pandora-boot-starter-hsf-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\plugin\hsf\2.2.7.8-BUGFIX\hsf-2.2.7.8-BUGFIX.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\plugin\config-client\2.0.5\config-client-2.0.5.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\plugin\spas-sdk-service\1.3.0\spas-sdk-service-1.3.0.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\plugin\spas-sdk-client\1.3.0\spas-sdk-client-1.3.0.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\boot\pandora-hsf-spring-boot-autoconfigure\2019-04-stable\pandora-hsf-spring-boot-autoconfigure-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\boot\pandora-hsf-spring-boot-autoconfigure2\2019-04-stable\pandora-hsf-spring-boot-autoconfigure2-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\fastjson\1.2.50\fastjson-1.2.50.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\boot\pandora-tair-spring-boot-starter\2019-04-stable\pandora-tair-spring-boot-starter-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\pandora-boot-starter-tair\2019-04-stable\pandora-boot-starter-tair-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\plugin\tair-plugin\4.1.6\tair-plugin-4.1.6.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\boot\pandora-tair-spring-boot-autoconfigure\2019-04-stable\pandora-tair-spring-boot-autoconfigure-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\boot\pandora-tair-spring-boot-autoconfigure2\2019-04-stable\pandora-tair-spring-boot-autoconfigure2-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\yunos\open\open-client\1.3.3-SNAPSHOT\open-client-1.3.3-20190731.063901-6.jar;C:\Users\wb-hll364276\.m2\repository\com\yunos\cloudcard\cloudcard-sdk\1.1\cloudcard-sdk-1.1.jar;C:\Users\wb-hll364276\.m2\repository\commons-lang\commons-lang\2.6\commons-lang-2.6.jar;C:\Users\wb-hll364276\.m2\repository\com\yunos\open\yunospull-sdk\1.3.9\yunospull-sdk-1.3.9.jar;C:\Users\wb-hll364276\.m2\repository\commons-beanutils\commons-beanutils-core\1.8.3\commons-beanutils-core-1.8.3.jar;C:\Users\wb-hll364276\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.8.11\jackson-core-2.8.11.jar;C:\Users\wb-hll364276\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.8.11.3\jackson-databind-2.8.11.3.jar;C:\Users\wb-hll364276\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.8.0\jackson-annotations-2.8.0.jar;C:\Users\wb-hll364276\.m2\repository\org\apache\httpcomponents\httpcore\4.4.11\httpcore-4.4.11.jar;C:\Users\wb-hll364276\.m2\repository\org\slf4j\slf4j-api\1.7.26\slf4j-api-1.7.26.jar;C:\Users\wb-hll364276\.m2\repository\org\slf4j\jcl-over-slf4j\1.7.26\jcl-over-slf4j-1.7.26.jar;C:\Users\wb-hll364276\.m2\repository\org\logback-extensions\logback-ext-spring\0.1.1\logback-ext-spring-0.1.1.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\common\fulllinkstresstesting\0.9.9.5\fulllinkstresstesting-0.9.9.5.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\boot\pandora-metaq-spring-boot-starter\2019-04-stable\pandora-metaq-spring-boot-starter-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\pandora-boot-starter-metaq\2019-04-stable\pandora-boot-starter-metaq-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\plugin\metaq-client\4.2.6.Final\metaq-client-4.2.6.Final.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\plugin\rocketmq-client\4.3.5\rocketmq-client-4.3.5.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\boot\pandora-metaq-spring-boot-autoconfigure\2019-04-stable\pandora-metaq-spring-boot-autoconfigure-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\pandora-boot-common\2.1.11.3\pandora-boot-common-2.1.11.3.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\boot\pandora-metaq-spring-boot-autoconfigure2\2019-04-stable\pandora-metaq-spring-boot-autoconfigure2-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\google\guava\guava\23.0\guava-23.0.jar;C:\Users\wb-hll364276\.m2\repository\com\google\code\findbugs\jsr305\1.3.9\jsr305-1.3.9.jar;C:\Users\wb-hll364276\.m2\repository\com\google\errorprone\error_prone_annotations\2.0.18\error_prone_annotations-2.0.18.jar;C:\Users\wb-hll364276\.m2\repository\com\google\j2objc\j2objc-annotations\1.1\j2objc-annotations-1.1.jar;C:\Users\wb-hll364276\.m2\repository\org\codehaus\mojo\animal-sniffer-annotations\1.14\animal-sniffer-annotations-1.14.jar;C:\Users\wb-hll364276\.m2\repository\com\aliyun\aliyun-java-sdk-core\4.1.1\aliyun-java-sdk-core-4.1.1.jar;C:\Users\wb-hll364276\.m2\repository\com\google\code\gson\gson\2.8.5\gson-2.8.5.jar;C:\Users\wb-hll364276\.m2\repository\org\apache\httpcomponents\httpclient\4.5.8\httpclient-4.5.8.jar;C:\Users\wb-hll364276\.m2\repository\javax\xml\bind\jaxb-api\2.1\jaxb-api-2.1.jar;C:\Users\wb-hll364276\.m2\repository\javax\xml\stream\stax-api\1.0-2\stax-api-1.0-2.jar;C:\Users\wb-hll364276\.m2\repository\com\sun\xml\bind\jaxb-core\2.1.14\jaxb-core-2.1.14.jar;C:\Users\wb-hll364276\.m2\repository\com\sun\xml\bind\jaxb-impl\2.1\jaxb-impl-2.1.jar;C:\Users\wb-hll364276\.m2\repository\javax\activation\activation\1.1.1\activation-1.1.1.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\keycenter\keycenter-client\2.3.7\keycenter-client-2.3.7.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\keycenter\keycenter-common\2.3.7\keycenter-common-2.3.7.jar;C:\Users\wb-hll364276\.m2\repository\org\bouncycastle\bcpg-jdk15on\1.47\bcpg-jdk15on-1.47.jar;C:\Users\wb-hll364276\.m2\repository\org\bouncycastle\bcprov-jdk15on\1.47\bcprov-jdk15on-1.47.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\util\util\1.0\util-1.0.jar;C:\Users\wb-hll364276\.m2\repository\de\flexiprovider\FlexiProvider\1.6p7.signed\FlexiProvider-1.6p7.signed.jar;C:\Users\wb-hll364276\.m2\repository\de\flexiprovider\CoDec\build17-jdk13\CoDec-build17-jdk13.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\external\java.jce.cryptix\0.0.0\java.jce.cryptix-0.0.0.jar;C:\Users\wb-hll364276\.m2\repository\commons-io\commons-io\2.4\commons-io-2.4.jar;C:\Users\wb-hll364276\.m2\repository\org\slf4j\slf4j-log4j12\1.7.26\slf4j-log4j12-1.7.26.jar;C:\Users\wb-hll364276\.m2\repository\log4j\log4j\1.2.17\log4j-1.2.17.jar;C:\Users\wb-hll364276\.m2\repository\commons-codec\commons-codec\1.10\commons-codec-1.10.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\hsf\hsfunit\1.0.2-SNAPSHOT\hsfunit-1.0.2-SNAPSHOT.jar;C:\Users\wb-hll364276\.m2\repository\com\alios\miniapp\miniapp-share-api\1.0-SNAPSHOT\miniapp-share-api-1.0-20190806.073325-5.jar;C:\Users\wb-hll364276\.m2\repository\com\yunos\digitalstoreutils\1.8-SNAPSHOT\digitalstoreutils-1.8-20190807.030100-918.jar;C:\Users\wb-hll364276\.m2\repository\joda-time\joda-time\2.9.9\joda-time-2.9.9.jar;C:\Users\wb-hll364276\.m2\repository\com\fasterxml\uuid\java-uuid-generator\3.1.4\java-uuid-generator-3.1.4.jar;C:\Users\wb-hll364276\.m2\repository\io\protostuff\protostuff-api\1.3.8\protostuff-api-1.3.8.jar;C:\Users\wb-hll364276\.m2\repository\io\protostuff\protostuff-collectionschema\1.3.8\protostuff-collectionschema-1.3.8.jar;C:\Users\wb-hll364276\.m2\repository\io\protostuff\protostuff-core\1.3.8\protostuff-core-1.3.8.jar;C:\Users\wb-hll364276\.m2\repository\io\protostuff\protostuff-runtime\1.3.8\protostuff-runtime-1.3.8.jar;C:\Users\wb-hll364276\.m2\repository\com\alios\miniapp\miniapp-core-client\1.0.0-SNAPSHOT\miniapp-core-client-1.0.0-20190812.081222-96.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\boot\pandora-alimonitor-spring-boot-starter\2019-04-stable\pandora-alimonitor-spring-boot-starter-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\pandora-boot-starter-alimonitor\2019-04-stable\pandora-boot-starter-alimonitor-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\plugin\alimonitor-jmonitor\1.2.6\alimonitor-jmonitor-1.2.6.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\boot\pandora-alimonitor-spring-boot-autoconfigure\2019-04-stable\pandora-alimonitor-spring-boot-autoconfigure-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\boot\pandora-eagleeye-spring-boot-starter\2019-04-stable\pandora-eagleeye-spring-boot-starter-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\pandora-boot-starter-eagleeye\2019-04-stable\pandora-boot-starter-eagleeye-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\boot\spring-boot-alibaba-eagleeye-autoconfigure\2019-04-stable\spring-boot-alibaba-eagleeye-autoconfigure-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\yunos\gan\1.0.0-SNAPSHOT\gan-1.0.0-20150805.094435-8.jar;C:\Users\wb-hll364276\.m2\repository\com\yunos\account\yunos-account-api\1.1.5-SNAPSHOT\yunos-account-api-1.1.5-20180408.092627-1.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\platform\shared\havana.api\0.3.6\havana.api-0.3.6.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\platform\shared\havana.common\0.3.6\havana.common-0.3.6.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\platform\shared\havana.oauth.api\0.1.1-SNAPSHOT\havana.oauth.api-0.1.1-20130911.054231-6.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\wireless\wireless-member-ssologin\1.0.0-SNAPSHOT\wireless-member-ssologin-1.0.0-20130609.032422-7.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\wireless\wireless-member-union-accounts-login\1.0.1-SNAPSHOT\wireless-member-union-accounts-login-1.0.1-20130904.141908-2.jar;C:\Users\wb-hll364276\.m2\repository\com\aliyun\apigateway\agent\gateway-agent\1.0.6\gateway-agent-1.0.6.jar com.alios.miniapp.service.impl.Gc
  2. [GC (System.gc()) [PSYoungGen: 12105K->1765K(75776K)] 12105K->1773K(249344K), 0.0170246 secs] [Times: user=0.03 sys=0.00, real=0.02 secs]
  3. [Full GC (System.gc()) [PSYoungGen: 1765K->0K(75776K)] [ParOldGen: 8K->1652K(173568K)] 1773K->1652K(249344K), [Metaspace: 3294K->3294K(1056768K)], 0.0109141 secs] [Times: user=0.05 sys=0.00, real=0.01 secs]
  4. Heap
  5. PSYoungGen total 75776K, used 1951K [0x000000076b600000, 0x0000000770a80000, 0x00000007c0000000)
  6. eden space 65024K, 3% used [0x000000076b600000,0x000000076b7e7c80,0x000000076f580000)
  7. from space 10752K, 0% used [0x000000076f580000,0x000000076f580000,0x0000000770000000)
  8. to space 10752K, 0% used [0x0000000770000000,0x0000000770000000,0x0000000770a80000)
  9. ParOldGen total 173568K, used 1652K [0x00000006c2200000, 0x00000006ccb80000, 0x000000076b600000)
  10. object space 173568K, 0% used [0x00000006c2200000,0x00000006c239d238,0x00000006ccb80000)
  11. Metaspace used 3313K, capacity 4496K, committed 4864K, reserved 1056768K
  12. class space used 356K, capacity 388K, committed 512K, reserved 1048576K
  13. Process finished with exit code 0

// 打印GC日志 需要配置参数 -XX:+PrintGCDetails
运行结果中可以清楚的看到GC日志包含 “ 1773K->1652K “ ,意味着虚拟机并没有因为这两个对象相互引用就不回收它。

2.2 根搜索算法

通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索的路径称为引用链,当一个对象到“GC Roots”没有任何引用链相连的话,也就是GC Roots到这个对象不可达时,证明此对象已经不可用,可以被回收了。
可作为GC roots的对象的包括下面几种:

  • 栈中的对象引用、
  • 方法区中常量的引用、
  • 方法区中静态对象的引擎、
  • 本地方法区中native对象的引用

概述 - 图1

2.3 再谈引用

在JDK 1.2以前的版本中,如果一个对象没有被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有当对象处于可达(reachable)状态时,程序才能使用它。只有在对象没有任何其他对象引用它时,垃圾回收器才会对它进行收集。对象只有被引用和没有被引用两种状态。这种方式无法描述一些“食之无味,弃之可惜”的对象。
而很多时候,我们希望存在这样一些对象:当内存空间足够时,可以将它们保存在内存中,不进行回收;当内存空间变得紧张时,允许JVM回收这些对象。大部分缓存都符合这样的场景。
从JDK 1.2版本开始,Java对引用的概念进行了扩充,对象的引用分成了4种级别,从而使程序开发者能更加灵活地控制对象的生命周期,更好的控制创建的对象何时被释放和回收。
这4种级别由高到低依次为:强引用、软引用、弱引用和虚引用。
强引用 强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMmoryError错误,使程序异常终止,也不会靠随意回收具有强引用 对象来解决内存不足的问题。Object obj = new Object( );
软引用 软引用是用来描述一些还有用但并非必须的对象。对于软引用关联着的对象,在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围进行第二次回收。如果这次回收还没有足够的内存,才会抛出内存溢出异常。


import java.lang.ref.SoftReference;

/**
 * 软引用何时被收集
 * @author hll
 * @date 2019/8/19.
 */
public class SoftReferenceDemo {

    public static void main(String[] args) throws InterruptedException {
        //100M的缓存数据
        byte[] cacheData = new byte[100 * 1024 * 1024];
        //将缓存数据用软引用持有
        SoftReference<byte[]> cacheRef = new SoftReference<>(cacheData);
        //将缓存数据的强引用去除
        cacheData = null;
        System.out.println("第一次GC前" + cacheData);
        System.out.println("第一次GC前" + cacheRef.get());
        //进行一次GC后查看对象的回收情况
        System.gc();
        //等待GC
        Thread.sleep(500);
        System.out.println("第一次GC后" + cacheData);
        System.out.println("第一次GC后" + cacheRef.get());

        //在分配一个120M的对象,看看缓存对象的回收情况
        byte[] newData = new byte[120 * 1024 * 1024];
        System.out.println("分配后" + cacheData);
        System.out.println("分配后" + cacheRef.get());
    }

}

结果:

D:\java\jdk1.8.0_211\bin\java -XX:+PrintGCDetails -Xms200m -Xmx200m "-javaagent:D:\IntelliJ IDEA2017.1.2\lib\idea_rt.jar=60386:D:\IntelliJ IDEA2017.1.2\bin" -Dfile.encoding=UTF-8 -classpath D:\java\jdk1.8.0_211\jre\lib\charsets.jar;D:\java\jdk1.8.0_211\jre\lib\deploy.jar;D:\java\jdk1.8.0_211\jre\lib\ext\access-bridge-64.jar;D:\java\jdk1.8.0_211\jre\lib\ext\cldrdata.jar;D:\java\jdk1.8.0_211\jre\lib\ext\dnsns.jar;D:\java\jdk1.8.0_211\jre\lib\ext\jaccess.jar;D:\java\jdk1.8.0_211\jre\lib\ext\jfxrt.jar;D:\java\jdk1.8.0_211\jre\lib\ext\localedata.jar;D:\java\jdk1.8.0_211\jre\lib\ext\nashorn.jar;D:\java\jdk1.8.0_211\jre\lib\ext\sunec.jar;D:\java\jdk1.8.0_211\jre\lib\ext\sunjce_provider.jar;D:\java\jdk1.8.0_211\jre\lib\ext\sunmscapi.jar;D:\java\jdk1.8.0_211\jre\lib\ext\sunpkcs11.jar;D:\java\jdk1.8.0_211\jre\lib\ext\zipfs.jar;D:\java\jdk1.8.0_211\jre\lib\javaws.jar;D:\java\jdk1.8.0_211\jre\lib\jce.jar;D:\java\jdk1.8.0_211\jre\lib\jfr.jar;D:\java\jdk1.8.0_211\jre\lib\jfxswt.jar;D:\java\jdk1.8.0_211\jre\lib\jsse.jar;D:\java\jdk1.8.0_211\jre\lib\management-agent.jar;D:\java\jdk1.8.0_211\jre\lib\plugin.jar;D:\java\jdk1.8.0_211\jre\lib\resources.jar;D:\java\jdk1.8.0_211\jre\lib\rt.jar;D:\workSpace\miniapp-common-biz\miniapp-common-biz-service\target\classes;C:\Users\wb-hll364276\.m2\repository\com\alios\miniapp\miniapp-common-utils\1.0.0-SNAPSHOT\miniapp-common-utils-1.0.0-20190801.101656-39.jar;C:\Users\wb-hll364276\.m2\repository\com\esotericsoftware\reflectasm\reflectasm\1.09\reflectasm-1.09.jar;C:\Users\wb-hll364276\.m2\repository\org\ow2\asm\asm\4.0\asm-4.0.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\reactive\reactive-ext\1.1.2\reactive-ext-1.1.2.jar;C:\Users\wb-hll364276\.m2\repository\io\reactivex\rxjava2\rxjava\2.1.16\rxjava-2.1.16.jar;C:\Users\wb-hll364276\.m2\repository\org\reactivestreams\reactive-streams\1.0.2\reactive-streams-1.0.2.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\reactive\reactive-pipeline\1.1.2\reactive-pipeline-1.1.2.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\reactive\pipeline-api\999-not-exist\pipeline-api-999-not-exist.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\transmittable-thread-local\2.5.0\transmittable-thread-local-2.5.0.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\ajdk\ajdk-api\8.4.7-0-1\ajdk-api-8.4.7-0-1.jar;C:\Users\wb-hll364276\.m2\repository\org\apache\httpcomponents\httpasyncclient\4.1.4\httpasyncclient-4.1.4.jar;C:\Users\wb-hll364276\.m2\repository\org\apache\httpcomponents\httpcore-nio\4.4.10\httpcore-nio-4.4.10.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\rdb\rdb-client2\2.2.3\rdb-client2-2.2.3.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\middleware\logger.api\0.2.5\logger.api-0.2.5.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\middleware\logger.core\0.2.5\logger.core-0.2.5.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\middleware\logger.pandolet\0.2.5\logger.pandolet-0.2.5.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\diamond\diamond-client\3.7.8\diamond-client-3.7.8.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\diamond\diamond-utils\3.2.0\diamond-utils-3.2.0.jar;C:\Users\wb-hll364276\.m2\repository\org\codehaus\jackson\jackson-mapper-lgpl\1.9.6\jackson-mapper-lgpl-1.9.6.jar;C:\Users\wb-hll364276\.m2\repository\org\codehaus\jackson\jackson-core-lgpl\1.9.6\jackson-core-lgpl-1.9.6.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\metrics-core-api\1.0.0\metrics-core-api-1.0.0.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\vipserver\vipserver-client\4.6.2\vipserver-client-4.6.2.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\eagleeye\eagleeye-core\1.5.2.1\eagleeye-core-1.5.2.1.jar;C:\Users\wb-hll364276\.m2\repository\javax\servlet\javax.servlet-api\3.1.0\javax.servlet-api-3.1.0.jar;C:\Users\wb-hll364276\.m2\repository\cglib\cglib-nodep\3.2.4\cglib-nodep-3.2.4.jar;C:\Users\wb-hll364276\.m2\repository\io\netty\netty-all\4.0.56.Final\netty-all-4.0.56.Final.jar;D:\workSpace\miniapp-common-biz\miniapp-common-biz-client\target\classes;C:\Users\wb-hll364276\.m2\repository\com\alios\miniapp\miniapp-common-client\1.0.0-SNAPSHOT\miniapp-common-client-1.0.0-20190801.101649-65.jar;C:\Users\wb-hll364276\.m2\repository\org\projectlombok\lombok\1.18.8\lombok-1.18.8.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\fastvalidator\fastvalidator-spring-boot-starter\2.5.5.0\fastvalidator-spring-boot-starter-2.5.5.0.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\fastvalidator\fastvalidator-core\2.5.5.0\fastvalidator-core-2.5.5.0.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\fastvalidator\fastvalidator-generator\2.5.5.0\fastvalidator-generator-2.5.5.0.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\fastvalidator\fastvalidator-constraints\2.5.5.0\fastvalidator-constraints-2.5.5.0.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\fastvalidator\fastvalidator-logger\2.5.5.0\fastvalidator-logger-2.5.5.0.jar;C:\Users\wb-hll364276\.m2\repository\javax\validation\validation-api\1.1.0.Final\validation-api-1.1.0.Final.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\fastvalidator\fastvalidator-jsr\2.5.5.0\fastvalidator-jsr-2.5.5.0.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\fastvalidator\fastvalidator-meta\2.5.5.0\fastvalidator-meta-2.5.5.0.jar;C:\Users\wb-hll364276\.m2\repository\org\springframework\boot\spring-boot-starter-actuator\1.5.20.RELEASE\spring-boot-starter-actuator-1.5.20.RELEASE.jar;C:\Users\wb-hll364276\.m2\repository\org\springframework\boot\spring-boot-actuator\1.5.20.RELEASE\spring-boot-actuator-1.5.20.RELEASE.jar;C:\Users\wb-hll364276\.m2\repository\org\springframework\boot\spring-boot-starter-aop\1.5.20.RELEASE\spring-boot-starter-aop-1.5.20.RELEASE.jar;C:\Users\wb-hll364276\.m2\repository\org\springframework\spring-aop\4.3.23.RELEASE\spring-aop-4.3.23.RELEASE.jar;C:\Users\wb-hll364276\.m2\repository\org\aspectj\aspectjweaver\1.8.14\aspectjweaver-1.8.14.jar;C:\Users\wb-hll364276\.m2\repository\org\springframework\spring-core\4.3.23.RELEASE\spring-core-4.3.23.RELEASE.jar;C:\Users\wb-hll364276\.m2\repository\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;C:\Users\wb-hll364276\.m2\repository\org\springframework\spring-context\4.3.23.RELEASE\spring-context-4.3.23.RELEASE.jar;C:\Users\wb-hll364276\.m2\repository\org\springframework\spring-expression\4.3.23.RELEASE\spring-expression-4.3.23.RELEASE.jar;C:\Users\wb-hll364276\.m2\repository\org\springframework\boot\spring-boot-configuration-processor\1.5.20.RELEASE\spring-boot-configuration-processor-1.5.20.RELEASE.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\boot\pandora-tddl-spring-boot-starter\2019-04-stable\pandora-tddl-spring-boot-starter-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\pandora-boot-starter-tddl\2019-04-stable\pandora-boot-starter-tddl-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\pandora-boot-starter\2019-04-stable\pandora-boot-starter-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\pandora-boot-bootstrap\2.1.11.3\pandora-boot-bootstrap-2.1.11.3.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\pandora-boot-loader\2.1.11.3\pandora-boot-loader-2.1.11.3.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\pandora-boot-version\2.1.11.3\pandora-boot-version-2.1.11.3.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\pandora.archive\2.1.11\pandora.archive-2.1.11.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\pandora-boot-autoconf\2.1.11.3\pandora-boot-autoconf-2.1.11.3.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\pandora-boot-bootstrap-springboot2\2.1.11.3\pandora-boot-bootstrap-springboot2-2.1.11.3.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\taobao-hsf.sar-container\2019-04-stable\taobao-hsf.sar-container-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\plugin\metrics\2.0.2\metrics-2.0.2.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\plugin\pandolet\1.0.2\pandolet-1.0.2.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\plugin\pandora-qos-service\2.1.6.7\pandora-qos-service-2.1.6.7.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\plugin\tddl-client\5.2.8\tddl-client-5.2.8.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\plugin\unitrouter\1.2.3\unitrouter-1.2.3.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\plugin\diamond-client\3.8.15\diamond-client-3.8.15.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\plugin\eagleeye-core\1.8.1.2\eagleeye-core-1.8.1.2.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\plugin\vipserver-client\4.8.0\vipserver-client-4.8.0.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\plugin\dpath\1.5\dpath-1.5.jar;C:\Users\wb-hll364276\.m2\repository\org\springframework\boot\spring-boot-starter\1.5.20.RELEASE\spring-boot-starter-1.5.20.RELEASE.jar;C:\Users\wb-hll364276\.m2\repository\org\springframework\boot\spring-boot\1.5.20.RELEASE\spring-boot-1.5.20.RELEASE.jar;C:\Users\wb-hll364276\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\1.5.20.RELEASE\spring-boot-autoconfigure-1.5.20.RELEASE.jar;C:\Users\wb-hll364276\.m2\repository\org\springframework\boot\spring-boot-starter-logging\1.5.20.RELEASE\spring-boot-starter-logging-1.5.20.RELEASE.jar;C:\Users\wb-hll364276\.m2\repository\ch\qos\logback\logback-classic\1.1.11\logback-classic-1.1.11.jar;C:\Users\wb-hll364276\.m2\repository\ch\qos\logback\logback-core\1.1.11\logback-core-1.1.11.jar;C:\Users\wb-hll364276\.m2\repository\org\slf4j\jul-to-slf4j\1.7.26\jul-to-slf4j-1.7.26.jar;C:\Users\wb-hll364276\.m2\repository\org\slf4j\log4j-over-slf4j\1.7.26\log4j-over-slf4j-1.7.26.jar;C:\Users\wb-hll364276\.m2\repository\org\yaml\snakeyaml\1.17\snakeyaml-1.17.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\boot\pandora-tddl-spring-boot-autoconfigure\2019-04-stable\pandora-tddl-spring-boot-autoconfigure-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\boot\spring-boot-alibaba-context\2019-04-stable\spring-boot-alibaba-context-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\org\apache\commons\commons-lang3\3.5\commons-lang3-3.5.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\sdk\2019-04-stable\sdk-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\spas-sdk-service-sdk\1.3.0--2019-04-stable\spas-sdk-service-sdk-1.3.0--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\metrics-sdk\2.0.2--2019-04-stable\metrics-sdk-2.0.2--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\vipserver-client-sdk\4.8.0--2019-04-stable\vipserver-client-sdk-4.8.0--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\monitor-sdk\1.2.12--2019-04-stable\monitor-sdk-1.2.12--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\acl.plugin-sdk\2.2.02--2019-04-stable\acl.plugin-sdk-2.2.02--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\notify-tr-client-sdk\5.0.3--2019-04-stable\notify-tr-client-sdk-5.0.3--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\spas-sdk-client-sdk\1.3.0--2019-04-stable\spas-sdk-client-sdk-1.3.0--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\config-client-sdk\2.0.5--2019-04-stable\config-client-sdk-2.0.5--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\filesync-client-sdk\1.0.10--2019-04-stable\filesync-client-sdk-1.0.10--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\tddl-client-sdk\5.2.8--2019-04-stable\tddl-client-sdk-5.2.8--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\tbsession-sdk\3.1.4.7--2019-04-stable\tbsession-sdk-3.1.4.7--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\hsf-notify-client-sdk\3.2.2--2019-04-stable\hsf-notify-client-sdk-3.2.2--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\diamond-client-sdk\3.8.15--2019-04-stable\diamond-client-sdk-3.8.15--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\pandora-qos-service-sdk\2.1.6.7--2019-04-stable\pandora-qos-service-sdk-2.1.6.7--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\ons-sdk-sdk\1.8.0-EagleEye--2019-04-stable\ons-sdk-sdk-1.8.0-EagleEye--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\tair-plugin-sdk\4.1.6--2019-04-stable\tair-plugin-sdk-4.1.6--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\rocketmq-client-sdk\4.3.5--2019-04-stable\rocketmq-client-sdk-4.3.5--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\switch-sdk\2.1.1.1--2019-04-stable\switch-sdk-2.1.1.1--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\buc.sso.client.plugin-sdk\0.9.12--2019-04-stable\buc.sso.client.plugin-sdk-0.9.12--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\eagleeye-core-sdk\1.8.1.2--2019-04-stable\eagleeye-core-sdk-1.8.1.2--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\pandora-framework-sdk\2.1.8.1--2019-04-stable\pandora-framework-sdk-2.1.8.1--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\alimonitor-jmonitor-sdk\1.2.6--2019-04-stable\alimonitor-jmonitor-sdk-1.2.6--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\pandolet-sdk\1.0.2--2019-04-stable\pandolet-sdk-1.0.2--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\hsf-sdk\2.2.7.8-BUGFIX--2019-04-stable\hsf-sdk-2.2.7.8-BUGFIX--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\metaq-client-sdk\4.2.6.Final--2019-04-stable\metaq-client-sdk-4.2.6.Final--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\mtop-uncenter-sdk\1.0.5.3--2019-04-stable\mtop-uncenter-sdk-1.0.5.3--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\middleware\unitrouter-sdk\1.2.3--2019-04-stable\unitrouter-sdk-1.2.3--2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\boot\pandora-tddl-spring-boot-autoconfigure2\2019-04-stable\pandora-tddl-spring-boot-autoconfigure2-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\org\springframework\spring-jcl\999-not-exist-SNAPSHOT\spring-jcl-999-not-exist-20180308.110450-1.jar;C:\Users\wb-hll364276\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\1.5.20.RELEASE\spring-boot-starter-jdbc-1.5.20.RELEASE.jar;C:\Users\wb-hll364276\.m2\repository\org\apache\tomcat\tomcat-jdbc\8.5.39\tomcat-jdbc-8.5.39.jar;C:\Users\wb-hll364276\.m2\repository\org\apache\tomcat\tomcat-juli\8.5.39\tomcat-juli-8.5.39.jar;C:\Users\wb-hll364276\.m2\repository\org\springframework\spring-jdbc\4.3.23.RELEASE\spring-jdbc-4.3.23.RELEASE.jar;C:\Users\wb-hll364276\.m2\repository\org\springframework\spring-beans\4.3.23.RELEASE\spring-beans-4.3.23.RELEASE.jar;C:\Users\wb-hll364276\.m2\repository\org\springframework\spring-tx\4.3.23.RELEASE\spring-tx-4.3.23.RELEASE.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\boot\pandora-diamond-spring-boot-starter\2019-04-stable\pandora-diamond-spring-boot-starter-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\pandora-boot-starter-diamond\2019-04-stable\pandora-boot-starter-diamond-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\boot\spring-boot-alibaba-diamond-autoconfigure\2019-04-stable\spring-boot-alibaba-diamond-autoconfigure-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\boot\spring-boot-alibaba-diamond-autoconfigure2\2019-04-stable\spring-boot-alibaba-diamond-autoconfigure2-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\org\codehaus\groovy\groovy-all\2.4.16\groovy-all-2.4.16.jar;C:\Users\wb-hll364276\.m2\repository\org\mybatis\spring\boot\mybatis-spring-boot-starter\1.1.1\mybatis-spring-boot-starter-1.1.1.jar;C:\Users\wb-hll364276\.m2\repository\org\mybatis\spring\boot\mybatis-spring-boot-autoconfigure\1.1.1\mybatis-spring-boot-autoconfigure-1.1.1.jar;C:\Users\wb-hll364276\.m2\repository\org\mybatis\mybatis\3.4.0\mybatis-3.4.0.jar;C:\Users\wb-hll364276\.m2\repository\org\mybatis\mybatis-spring\1.3.0\mybatis-spring-1.3.0.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\boot\pandora-hsf-spring-boot-starter\2019-04-stable\pandora-hsf-spring-boot-starter-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\pandora-boot-starter-hsf\2019-04-stable\pandora-boot-starter-hsf-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\plugin\hsf\2.2.7.8-BUGFIX\hsf-2.2.7.8-BUGFIX.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\plugin\config-client\2.0.5\config-client-2.0.5.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\plugin\spas-sdk-service\1.3.0\spas-sdk-service-1.3.0.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\plugin\spas-sdk-client\1.3.0\spas-sdk-client-1.3.0.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\boot\pandora-hsf-spring-boot-autoconfigure\2019-04-stable\pandora-hsf-spring-boot-autoconfigure-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\boot\pandora-hsf-spring-boot-autoconfigure2\2019-04-stable\pandora-hsf-spring-boot-autoconfigure2-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\fastjson\1.2.50\fastjson-1.2.50.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\boot\pandora-tair-spring-boot-starter\2019-04-stable\pandora-tair-spring-boot-starter-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\pandora-boot-starter-tair\2019-04-stable\pandora-boot-starter-tair-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\plugin\tair-plugin\4.1.6\tair-plugin-4.1.6.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\boot\pandora-tair-spring-boot-autoconfigure\2019-04-stable\pandora-tair-spring-boot-autoconfigure-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\boot\pandora-tair-spring-boot-autoconfigure2\2019-04-stable\pandora-tair-spring-boot-autoconfigure2-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\yunos\open\open-client\1.3.3-SNAPSHOT\open-client-1.3.3-20190731.063901-6.jar;C:\Users\wb-hll364276\.m2\repository\com\yunos\cloudcard\cloudcard-sdk\1.1\cloudcard-sdk-1.1.jar;C:\Users\wb-hll364276\.m2\repository\commons-lang\commons-lang\2.6\commons-lang-2.6.jar;C:\Users\wb-hll364276\.m2\repository\com\yunos\open\yunospull-sdk\1.3.9\yunospull-sdk-1.3.9.jar;C:\Users\wb-hll364276\.m2\repository\commons-beanutils\commons-beanutils-core\1.8.3\commons-beanutils-core-1.8.3.jar;C:\Users\wb-hll364276\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.8.11\jackson-core-2.8.11.jar;C:\Users\wb-hll364276\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.8.11.3\jackson-databind-2.8.11.3.jar;C:\Users\wb-hll364276\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.8.0\jackson-annotations-2.8.0.jar;C:\Users\wb-hll364276\.m2\repository\org\apache\httpcomponents\httpcore\4.4.11\httpcore-4.4.11.jar;C:\Users\wb-hll364276\.m2\repository\org\slf4j\slf4j-api\1.7.26\slf4j-api-1.7.26.jar;C:\Users\wb-hll364276\.m2\repository\org\slf4j\jcl-over-slf4j\1.7.26\jcl-over-slf4j-1.7.26.jar;C:\Users\wb-hll364276\.m2\repository\org\logback-extensions\logback-ext-spring\0.1.1\logback-ext-spring-0.1.1.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\common\fulllinkstresstesting\0.9.9.5\fulllinkstresstesting-0.9.9.5.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\boot\pandora-metaq-spring-boot-starter\2019-04-stable\pandora-metaq-spring-boot-starter-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\pandora-boot-starter-metaq\2019-04-stable\pandora-boot-starter-metaq-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\plugin\metaq-client\4.2.6.Final\metaq-client-4.2.6.Final.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\plugin\rocketmq-client\4.3.5\rocketmq-client-4.3.5.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\boot\pandora-metaq-spring-boot-autoconfigure\2019-04-stable\pandora-metaq-spring-boot-autoconfigure-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\pandora-boot-common\2.1.11.3\pandora-boot-common-2.1.11.3.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\boot\pandora-metaq-spring-boot-autoconfigure2\2019-04-stable\pandora-metaq-spring-boot-autoconfigure2-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\google\guava\guava\23.0\guava-23.0.jar;C:\Users\wb-hll364276\.m2\repository\com\google\code\findbugs\jsr305\1.3.9\jsr305-1.3.9.jar;C:\Users\wb-hll364276\.m2\repository\com\google\errorprone\error_prone_annotations\2.0.18\error_prone_annotations-2.0.18.jar;C:\Users\wb-hll364276\.m2\repository\com\google\j2objc\j2objc-annotations\1.1\j2objc-annotations-1.1.jar;C:\Users\wb-hll364276\.m2\repository\org\codehaus\mojo\animal-sniffer-annotations\1.14\animal-sniffer-annotations-1.14.jar;C:\Users\wb-hll364276\.m2\repository\com\aliyun\aliyun-java-sdk-core\4.1.1\aliyun-java-sdk-core-4.1.1.jar;C:\Users\wb-hll364276\.m2\repository\com\google\code\gson\gson\2.8.5\gson-2.8.5.jar;C:\Users\wb-hll364276\.m2\repository\org\apache\httpcomponents\httpclient\4.5.8\httpclient-4.5.8.jar;C:\Users\wb-hll364276\.m2\repository\javax\xml\bind\jaxb-api\2.1\jaxb-api-2.1.jar;C:\Users\wb-hll364276\.m2\repository\javax\xml\stream\stax-api\1.0-2\stax-api-1.0-2.jar;C:\Users\wb-hll364276\.m2\repository\com\sun\xml\bind\jaxb-core\2.1.14\jaxb-core-2.1.14.jar;C:\Users\wb-hll364276\.m2\repository\com\sun\xml\bind\jaxb-impl\2.1\jaxb-impl-2.1.jar;C:\Users\wb-hll364276\.m2\repository\javax\activation\activation\1.1.1\activation-1.1.1.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\keycenter\keycenter-client\2.3.7\keycenter-client-2.3.7.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\keycenter\keycenter-common\2.3.7\keycenter-common-2.3.7.jar;C:\Users\wb-hll364276\.m2\repository\org\bouncycastle\bcpg-jdk15on\1.47\bcpg-jdk15on-1.47.jar;C:\Users\wb-hll364276\.m2\repository\org\bouncycastle\bcprov-jdk15on\1.47\bcprov-jdk15on-1.47.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\util\util\1.0\util-1.0.jar;C:\Users\wb-hll364276\.m2\repository\de\flexiprovider\FlexiProvider\1.6p7.signed\FlexiProvider-1.6p7.signed.jar;C:\Users\wb-hll364276\.m2\repository\de\flexiprovider\CoDec\build17-jdk13\CoDec-build17-jdk13.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\external\java.jce.cryptix\0.0.0\java.jce.cryptix-0.0.0.jar;C:\Users\wb-hll364276\.m2\repository\commons-io\commons-io\2.4\commons-io-2.4.jar;C:\Users\wb-hll364276\.m2\repository\org\slf4j\slf4j-log4j12\1.7.26\slf4j-log4j12-1.7.26.jar;C:\Users\wb-hll364276\.m2\repository\log4j\log4j\1.2.17\log4j-1.2.17.jar;C:\Users\wb-hll364276\.m2\repository\commons-codec\commons-codec\1.10\commons-codec-1.10.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\hsf\hsfunit\1.0.2-SNAPSHOT\hsfunit-1.0.2-SNAPSHOT.jar;C:\Users\wb-hll364276\.m2\repository\com\alios\miniapp\miniapp-share-api\1.0-SNAPSHOT\miniapp-share-api-1.0-20190806.073325-5.jar;C:\Users\wb-hll364276\.m2\repository\com\yunos\digitalstoreutils\1.8-SNAPSHOT\digitalstoreutils-1.8-20190807.030100-918.jar;C:\Users\wb-hll364276\.m2\repository\joda-time\joda-time\2.9.9\joda-time-2.9.9.jar;C:\Users\wb-hll364276\.m2\repository\com\fasterxml\uuid\java-uuid-generator\3.1.4\java-uuid-generator-3.1.4.jar;C:\Users\wb-hll364276\.m2\repository\io\protostuff\protostuff-api\1.3.8\protostuff-api-1.3.8.jar;C:\Users\wb-hll364276\.m2\repository\io\protostuff\protostuff-collectionschema\1.3.8\protostuff-collectionschema-1.3.8.jar;C:\Users\wb-hll364276\.m2\repository\io\protostuff\protostuff-core\1.3.8\protostuff-core-1.3.8.jar;C:\Users\wb-hll364276\.m2\repository\io\protostuff\protostuff-runtime\1.3.8\protostuff-runtime-1.3.8.jar;C:\Users\wb-hll364276\.m2\repository\com\alios\miniapp\miniapp-core-client\1.0.0-SNAPSHOT\miniapp-core-client-1.0.0-20190812.081222-96.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\boot\pandora-alimonitor-spring-boot-starter\2019-04-stable\pandora-alimonitor-spring-boot-starter-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\pandora-boot-starter-alimonitor\2019-04-stable\pandora-boot-starter-alimonitor-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\plugin\alimonitor-jmonitor\1.2.6\alimonitor-jmonitor-1.2.6.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\boot\pandora-alimonitor-spring-boot-autoconfigure\2019-04-stable\pandora-alimonitor-spring-boot-autoconfigure-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\boot\pandora-eagleeye-spring-boot-starter\2019-04-stable\pandora-eagleeye-spring-boot-starter-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\pandora\pandora-boot-starter-eagleeye\2019-04-stable\pandora-boot-starter-eagleeye-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\boot\spring-boot-alibaba-eagleeye-autoconfigure\2019-04-stable\spring-boot-alibaba-eagleeye-autoconfigure-2019-04-stable.jar;C:\Users\wb-hll364276\.m2\repository\com\yunos\gan\1.0.0-SNAPSHOT\gan-1.0.0-20150805.094435-8.jar;C:\Users\wb-hll364276\.m2\repository\com\yunos\account\yunos-account-api\1.1.5-SNAPSHOT\yunos-account-api-1.1.5-20180408.092627-1.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\platform\shared\havana.api\0.3.6\havana.api-0.3.6.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\platform\shared\havana.common\0.3.6\havana.common-0.3.6.jar;C:\Users\wb-hll364276\.m2\repository\com\alibaba\platform\shared\havana.oauth.api\0.1.1-SNAPSHOT\havana.oauth.api-0.1.1-20130911.054231-6.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\wireless\wireless-member-ssologin\1.0.0-SNAPSHOT\wireless-member-ssologin-1.0.0-20130609.032422-7.jar;C:\Users\wb-hll364276\.m2\repository\com\taobao\wireless\wireless-member-union-accounts-login\1.0.1-SNAPSHOT\wireless-member-union-accounts-login-1.0.1-20130904.141908-2.jar;C:\Users\wb-hll364276\.m2\repository\com\aliyun\apigateway\agent\gateway-agent\1.0.6\gateway-agent-1.0.6.jar com.alios.miniapp.service.impl.SoftReferenceDemo
第一次GC前null
第一次GC前[B@15327b79
[GC (System.gc()) [PSYoungGen: 8306K->1861K(59904K)] 110706K->104269K(196608K), 0.0018955 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[Full GC (System.gc()) [PSYoungGen: 1861K->0K(59904K)] [ParOldGen: 102408K->104078K(136704K)] 104269K->104078K(196608K), [Metaspace: 3321K->3321K(1056768K)], 0.0076624 secs] [Times: user=0.03 sys=0.00, real=0.01 secs] 
第一次GC后null
第一次GC后[B@15327b79
[GC (Allocation Failure) [PSYoungGen: 1034K->32K(59904K)] 105112K->104110K(196608K), 0.0013175 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [PSYoungGen: 32K->32K(59904K)] 104110K->104110K(196608K), 0.0013005 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[Full GC (Allocation Failure) [PSYoungGen: 32K->0K(59904K)] [ParOldGen: 104078K->103775K(136704K)] 104110K->103775K(196608K), [Metaspace: 3325K->3325K(1056768K)], 0.0126720 secs] [Times: user=0.06 sys=0.00, real=0.01 secs] 
[GC (Allocation Failure) [PSYoungGen: 0K->0K(59904K)] 103775K->103775K(196608K), 0.0013744 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[Full GC (Allocation Failure) [PSYoungGen: 0K->0K(59904K)] [ParOldGen: 103775K->1353K(136704K)] 103775K->1353K(196608K), [Metaspace: 3325K->3325K(1056768K)], 0.0061360 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
分配后null
分配后null
Heap
 PSYoungGen      total 59904K, used 2586K [0x00000000fbd80000, 0x0000000100000000, 0x0000000100000000)
  eden space 51712K, 5% used [0x00000000fbd80000,0x00000000fc006800,0x00000000ff000000)
  from space 8192K, 0% used [0x00000000ff800000,0x00000000ff800000,0x0000000100000000)
  to   space 8192K, 0% used [0x00000000ff000000,0x00000000ff000000,0x00000000ff800000)
 ParOldGen       total 136704K, used 124233K [0x00000000f3800000, 0x00000000fbd80000, 0x00000000fbd80000)
  object space 136704K, 90% used [0x00000000f3800000,0x00000000fb152728,0x00000000fbd80000)
 Metaspace       used 3332K, capacity 4496K, committed 4864K, reserved 1056768K
  class space    used 357K, capacity 388K, committed 512K, reserved 1048576K

Process finished with exit code 0

jvm参数:-XX:+PrintGCDetails-Xms200m-Xmx200m

**弱引用 弱引用也是用来描述非必须对象的,他的强度比软引用更弱一些,被弱引用关联的对象,在垃圾回收时,如果这个对象只被弱引用关联(没有任何强引用关联他),那么这个对象就会被回收。

import java.lang.ref.WeakReference;
/**
 * 弱引用关联对象何时被回收
 * @author hll
 * @date 2019/8/19.
 */
public class WeakReferenceDemo {

    public static void main(String[] args) throws InterruptedException {
        //100M的缓存数据
        byte[] cacheData = new byte[100 * 1024 * 1024];
        //将缓存数据用软引用持有
        WeakReference<byte[]> cacheRef = new WeakReference<>(cacheData);
        System.out.println("第一次GC前" + cacheData);
        System.out.println("第一次GC前" + cacheRef.get());
        //进行一次GC后查看对象的回收情况
        System.gc();
        //等待GC
        Thread.sleep(500);
        System.out.println("第一次GC后" + cacheData);
        System.out.println("第一次GC后" + cacheRef.get());

        //将缓存数据的强引用去除
        cacheData = null;
        System.gc();
        //等待GC
        Thread.sleep(500);
        System.out.println("第二次GC后" + cacheData);
        System.out.println("第二次GC后" + cacheRef.get());
    }

}

结果:

第一次GC前[B@15327b79
第一次GC前[B@15327b79
第一次GC后[B@15327b79
第一次GC后[B@15327b79
第二次GC后null
第二次GC后null

PS: 从上面的代码中可以看出,弱引用关联的对象是否回收取决于这个对象有没有其他强引用指向它。这个确实很难理解,既然弱引用关联对象的存活周期和强引用差不多,那直接用强引用好了,干嘛费用弄出个弱引用呢?
eg:

    static Map<Object,Object> container = new HashMap<>();
    public static void putToContainer(Object key,Object value){
        container.put(key,value);
}
    public static void main(String[] args) {
        //某个类中有这样一段代码
        Object key = new Object();
        Object value = new Object();
        putToContainer(key,value);
        //..........
        /**
         * 若干调用层次后程序员发现这个key指向的对象没有用了,
         * 为了节省内存打算把这个对象抛弃,然而下面这个方式真的能把对象回收掉吗?
         * 由于container对象中包含了这个对象的引用,所以这个对象不能按照程序员的意向进行回收.
         * 并且由于在程序中的任何部分没有再出现这个键,所以,这个键 / 值 对无法从映射中删除。
         * 很可能会造成内存泄漏。
         */
        key = null;
}

《Java核心技术卷1》:

设计 WeakHashMap类是为了解决一个有趣的问题。如果有一个值,对应的键已经不再 使用了, 将会出现什么情况呢? 假定对某个键的最后一次引用已经消亡,不再有任何途径引 用这个值的对象了。但是,由于在程序中的任何部分没有再出现这个键,所以,这个键 / 值 对无法从映射中删除。为什么垃圾回收器不能够删除它呢? 难道删除无用的对象不是垃圾回 收器的工作吗? 遗憾的是,事情没有这样简单。垃圾回收器跟踪活动的对象。只要映射对象是活动的, 其中的所有桶也是活动的, 它们不能被回收。因此,需要由程序负责从长期存活的映射表中 删除那些无用的值。 或者使用 WeakHashMap完成这件事情。当对键的唯一引用来自散列条 目时, 这一数据结构将与垃圾回收器协同工作一起删除键 / 值对。

WeakHashMap 使用弱引用(weak references) 保存键。 WeakReference 对象将引用保存到另外一个对象中,在这里,就是散列键。对于这种类型的 对象,垃圾回收器用一种特有的方式进行处理。通常,如果垃圾回收器发现某个特定的对象 已经没有他人引用了,就将其回收。然而, 如果某个对象只能由 WeakReference 引用, 垃圾 回收器仍然回收它,但要将引用这个对象的弱引用放人队列中。WeakHashMap将周期性地检 查队列, 以便找出新添加的弱引用。一个弱引用进人队列意味着这个键不再被他人使用, 并 且已经被收集起来。于是, WeakHashMap将删除对应的条目。
虚引用
一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来获取一个对象的实例。为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。虚引用和弱引用对关联对象的回收都不会产生影响,如果只有虚引用活着弱引用关联着对象,那么这个对象就会被回收。

2.3.1 Java的生命周期

  1. 创建阶段(Created)
  2. 应用阶段(In Use)
  3. 不可见阶段(Invisible)
  4. 不可达阶段(Unreachable)
  5. 收集阶段(Collected)
  6. 终结阶段(Finalized)
  7. 对象空间重分配阶段(De-allocated)

创建阶段(Created)
在创建阶段系统通过下面的几个步骤来完成对象的创建过程

  • 为对象分配存储空间
  • 开始构造对象
  • 从超类到子类对static成员进行初始化
  • 超类成员变量按顺序初始化,递归调用超类的构造方法
  • 子类成员变量按顺序初始化,子类构造方法调用
  • 一旦对象被创建,并被分派给某些变量赋值,这个对象的状态就切换到了应用阶段

应用阶段(In Use)
对象至少被一个强引用持有着。
不可见阶段(Invisible)
当一个对象处于不可见阶段时,说明程序本身不再持有该对象的任何强引用,虽然该这些引用仍然是存在着的。简单说就是程序的执行已经超出了该对象的作用域了。
不可达阶段(Unreachable)
对象处于不可达阶段是指该对象不再被任何强引用所持有。
与“不可见阶段”相比,“不可见阶段”是指程序不再持有该对象的任何强引用,这种情况下,该对象仍可能被JVM等系统下的某些已装载的静态变量或线程或JNI等强引用持有着,这些特殊的强引用被称为”GC root”。存在着这些GC root会导致对象的内存泄露情况,无法被回收。
收集阶段(Collected)
当垃圾回收器发现该对象已经处于“不可达阶段”并且垃圾回收器已经对该对象的内存空间重新分配做好准备时,则对象进入了“收集阶段”。如果该对象已经重写了finalize()方法,则会去执行该方法的终端操作。
这里要特别说明一下:不要重载finazlie()方法!原因有两点:

①会影响JVM的对象分配与回收速度 在分配该对象时,JVM需要在垃圾回收器上注册该对象,以便在回收时能够执行该重载方法;在该方法的执行时需要消耗CPU时间且在执行完该方法后才会重新执行回收操作,即至少需要垃圾回收器对该对象执行两次GC。 ②可能造成该对象的再次“复活” 在finalize()方法中,如果有其它的强引用再次持有该对象,则会导致对象的状态由“收集阶段”又重新变为“应用阶段”。这个已经破坏了Java对象的生命周期进程,且“复活”的对象不利用后续的代码管理。

终结阶段
当对象执行完finalize()方法后仍然处于不可达状态时,则该对象进入终结阶段。在该阶段是等待垃圾回收器对该对象空间进行回收。
对象空间重新分配阶段
垃圾回收器对该对象的所占用的内存空间进行回收或者再分配了,则该对象彻底消失了,称之为“对象空间重新分配阶段”。

2.4 生存还是死亡-两次标记

即使在可达性分析算法中不可达的对象,也并非是“非死不可”的,这时候它们暂时出于“缓刑”阶段,一个对象的真正死亡至少要经历两次标记过程:如果对象在进行中可达性分析后发现没有与 GC Roots 相连接的引用链,那他将会被第一次标记并且进行一次筛选,筛选条件是此对象是否有必要执行 finalize() 方法。当对象没有覆盖 finalize() 方法,或者 finalize() 方法已经被虚拟机调用过,虚拟机将这两种情况都视为“没有必要执行”。
如果这个对象被判定为有必要执行 finalize() 方法,那么这个对象竟会放置在一个叫做 F-Queue 的队列中,并在稍后由一个由虚拟机自动建立的、低优先级的 Finalizer 线程去执行它。这里所谓的“执行”是指虚拟机会出发这个方法,并不承诺或等待他运行结束。finalize() 方法是对象逃脱死亡命运的最后一次机会,稍后 GC 将对 F-Queue 中的对象进行第二次小规模的标记,如果对象要在 finalize() 中成功拯救自己 —— 只要重新与引用链上的任何一个对象简历关联即可。
finalize() 方法只会被系统自动调用一次。

2.5 回收方法区

很多人认为方法区(hotSpot虚拟机中的永久代)没有垃圾回收的,java虚拟机规范中确实说过可以不要求虚拟机在方法区中实现垃圾回收,而且 “性价比比较低” 。在堆中,尤其是在新生代中,一次垃圾回收一般可以回收 70% ~ 95% 的空间,而永久代的垃圾收集效率远低于此。
永久代垃圾回收主要两部分内容:废弃的常量和无用的类。
判断废弃常量:一般是判断有没有该常量的引用。
判断无用的类:要以下三个条件都满足

  • 该类所有的实例都已经回收,也就是 Java 堆中不存在该类的任何实例
  • 加载该类的 ClassLoader 已经被回收
  • 该类对应的 java.lang.Class 对象没有任何地方呗引用,无法在任何地方通过反射访问该类的方法