Java的四种引用---强软弱虚
强软弱虚
java中的数据被类型分为了两类,它们分别是基本类型和引用类型。一般我们new出来的对象都属于引用类型的范畴。我们知道java是有垃圾回收机制的一种语言,根据垃圾回收时的策略,java将对于堆对象的引用又进行了细分,引用被分为了强引用,软引用,弱引用和虚引用。
强引用
强引用又称普通引用,它是最常见的一种引用类型,一般我们通过new
关键字创建对象时,变量对于堆对象的引用就是强引用。
强引用的特点:
- 如果堆中的一个对象被强引用指向,那么这个变量将不会被GC回收。
- 在堆内存不够用的情况下,被强引用指向的对象也不会被回收。(宁可抛出OOM异常)
- 被强引用指向的对象,只有在引用消失后才会被GC回收。
测试代码-1:
public class Normal { public static void main(String[] args) throws InterruptedException, IOException { // 栈变量m对new出来的Memory对象的引用为强引用 Memory m = new Memory(1024 * 1024 * 20); //现在堆中的对象没有引用指向它,它要被GC回收 m = null; System.gc(); //当我们启动java程序是,默认会有两个线程,一个是我们的主线程,另一个是gc线程 //通常GC线程优先级比较低,并且GC线程默认为守护线程,即它会在主线程退出的同时退出 //为了观察Gc的效果 System.in.read(); } } class Memory{ private byte[] bytes; public Memory(int size) { this.bytes = new byte[size]; } @Override protected void finalize() throws Throwable { super.finalize(); System.out.println("被GC回收"); } } //被GC回收
测试代码-2:
public class Normal1 { public static void main(String[] args) throws InterruptedException { // 我们设定jvm参数,设置堆内存大小为25M // 栈变量m1对new出来的Memory对象的引用为强引用 // 申请了20MB的内存,实际会大于20MB,因为我们的byte[]被Memory对象wrapper Memory m1 = new Memory(1024 * 1024 * 20); System.gc(); Thread.sleep(1000); // 再申请10MB堆内存 Memory m2 = new Memory(1024 * 1024 * 10); } } // Connected to the target VM, address: '127.0.0.1:61718', transport: 'socket' // Exception in thread "main" java.lang.OutOfMemoryError: Java heap space // at com.cherry.Memory.<init>(Normal.java:32) // at com.cherry.Normal1.main(Normal1.java:14) // Disconnected from the target VM, address: '127.0.0.1:61718', transport: 'socket' // // Process finished with exit code 1
软引用
软引用的创建需要借助jdk中java.lang.ref.SoftReference
这个类来创建。也就是说,我们的变量是先引用到SoftReference这个对象,SofReference这个对象再去引用我们想要设置为软引用的对象。
软引用的特点
- 当堆内存够用时,被软引用指向的对象不会被GC回收。
- 当堆内存不够用时,被软引用指向的对象自动的被GC回收。
测试代码-3:
public class Soft_Ref { public static void main(String[] args) throws InterruptedException { //堆内存大小为50MB SoftReference<Memory> m1 = new SoftReference<>(new Memory(1024 * 1024 * 30)); // 显示调用GC System.gc(); // 此时内存够用,所以结果可以预见性的为GC不会回收被软引用指向的对象 Thread.sleep(1000); } }
测试代码-4:
public class Soft_Ref { public static void main(String[] args) throws InterruptedException { //堆内存大小为50MB SoftReference<Memory> m1 = new SoftReference<>(new Memory(1024 * 1024 * 30)); //申请20MB for (int i = 0; i < 20; i++) { System.out.println("[time] => " + System.currentTimeMillis()); SoftReference<Memory> ma = new SoftReference<>(new Memory(1024 * 1024)); Thread.sleep(200); } } } // /Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/bin/java -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:63090,suspend=y,server=n -Xmx50m -javaagent:/Users/qiunan/Library/Caches/IdeaIE2019.3/captureAgent/debugger-agent.jar -Dfile.encoding=UTF-8 -classpath "/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/deploy.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/ext/cldrdata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/ext/dnsns.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/ext/jaccess.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/ext/jfxrt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/ext/localedata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/ext/nashorn.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/ext/sunec.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/ext/zipfs.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/javaws.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/jfxswt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/management-agent.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/plugin.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/lib/ant-javafx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/lib/dt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/lib/javafx-mx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/lib/jconsole.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/lib/packager.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/lib/sa-jdi.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/lib/tools.jar:/Users/qiunan/IdeaProjects/ostream/ostream-web/target/classes:/Users/qiunan/home/local/repo/org/springframework/boot/spring-boot-configuration-processor/2.3.3.RELEASE/spring-boot-configuration-processor-2.3.3.RELEASE.jar:/Users/qiunan/home/local/repo/com/spring4all/swagger-spring-boot-starter/1.9.1.RELEASE/swagger-spring-boot-starter-1.9.1.RELEASE.jar:/Users/qiunan/home/local/repo/io/springfox/springfox-swagger-ui/2.9.2/springfox-swagger-ui-2.9.2.jar:/Users/qiunan/home/local/repo/io/springfox/springfox-spring-web/2.9.2/springfox-spring-web-2.9.2.jar:/Users/qiunan/home/local/repo/io/springfox/springfox-swagger2/2.9.2/springfox-swagger2-2.9.2.jar:/Users/qiunan/home/local/repo/io/swagger/swagger-annotations/1.5.20/swagger-annotations-1.5.20.jar:/Users/qiunan/home/local/repo/io/springfox/springfox-spi/2.9.2/springfox-spi-2.9.2.jar:/Users/qiunan/home/local/repo/io/springfox/springfox-core/2.9.2/springfox-core-2.9.2.jar:/Users/qiunan/home/local/repo/io/springfox/springfox-schema/2.9.2/springfox-schema-2.9.2.jar:/Users/qiunan/home/local/repo/io/springfox/springfox-swagger-common/2.9.2/springfox-swagger-common-2.9.2.jar:/Users/qiunan/home/local/repo/com/google/guava/guava/20.0/guava-20.0.jar:/Users/qiunan/home/local/repo/com/fasterxml/classmate/1.4.0/classmate-1.4.0.jar:/Users/qiunan/home/local/repo/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar:/Users/qiunan/home/local/repo/org/springframework/plugin/spring-plugin-core/1.2.0.RELEASE/spring-plugin-core-1.2.0.RELEASE.jar:/Users/qiunan/home/local/repo/org/springframework/plugin/spring-plugin-metadata/1.2.0.RELEASE/spring-plugin-metadata-1.2.0.RELEASE.jar:/Users/qiunan/home/local/repo/org/mapstruct/mapstruct/1.2.0.Final/mapstruct-1.2.0.Final.jar:/Users/qiunan/home/local/repo/io/swagger/swagger-models/1.5.24/swagger-models-1.5.24.jar:/Users/qiunan/home/local/repo/com/fasterxml/jackson/core/jackson-annotations/2.9.10/jackson-annotations-2.9.10.jar:/Users/qiunan/home/local/repo/io/springfox/springfox-bean-validators/2.9.2/springfox-bean-validators-2.9.2.jar:/Users/qiunan/home/local/repo/org/springframework/spring-webmvc/5.2.8.RELEASE/spring-webmvc-5.2.8.RELEASE.jar:/Users/qiunan/home/local/repo/org/springframework/spring-aop/5.2.8.RELEASE/spring-aop-5.2.8.RELEASE.jar:/Users/qiunan/home/local/repo/org/springframework/spring-beans/5.2.8.RELEASE/spring-beans-5.2.8.RELEASE.jar:/Users/qiunan/home/local/repo/org/springframework/spring-context/5.2.8.RELEASE/spring-context-5.2.8.RELEASE.jar:/Users/qiunan/home/local/repo/org/springframework/spring-core/5.2.8.RELEASE/spring-core-5.2.8.RELEASE.jar:/Users/qiunan/home/local/repo/org/springframework/spring-jcl/5.2.8.RELEASE/spring-jcl-5.2.8.RELEASE.jar:/Users/qiunan/home/local/repo/org/springframework/spring-expression/5.2.8.RELEASE/spring-expression-5.2.8.RELEASE.jar:/Users/qiunan/home/local/repo/org/springframework/spring-web/5.2.8.RELEASE/spring-web-5.2.8.RELEASE.jar:/Users/qiunan/home/local/repo/org/springframework/boot/spring-boot-starter-web/2.3.3.RELEASE/spring-boot-starter-web-2.3.3.RELEASE.jar:/Users/qiunan/home/local/repo/org/springframework/boot/spring-boot-starter/2.3.3.RELEASE/spring-boot-starter-2.3.3.RELEASE.jar:/Users/qiunan/home/local/repo/org/springframework/boot/spring-boot/2.3.3.RELEASE/spring-boot-2.3.3.RELEASE.jar:/Users/qiunan/home/local/repo/org/springframework/boot/spring-boot-autoconfigure/2.3.3.RELEASE/spring-boot-autoconfigure-2.3.3.RELEASE.jar:/Users/qiunan/home/local/repo/org/springframework/boot/spring-boot-starter-logging/2.3.3.RELEASE/spring-boot-starter-logging-2.3.3.RELEASE.jar:/Users/qiunan/home/local/repo/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar:/Users/qiunan/home/local/repo/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar:/Users/qiunan/home/local/repo/org/apache/logging/log4j/log4j-to-slf4j/2.13.3/log4j-to-slf4j-2.13.3.jar:/Users/qiunan/home/local/repo/org/apache/logging/log4j/log4j-api/2.13.3/log4j-api-2.13.3.jar:/Users/qiunan/home/local/repo/org/slf4j/jul-to-slf4j/1.7.30/jul-to-slf4j-1.7.30.jar:/Users/qiunan/home/local/repo/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar:/Users/qiunan/home/local/repo/org/yaml/snakeyaml/1.26/snakeyaml-1.26.jar:/Users/qiunan/home/local/repo/org/springframework/boot/spring-boot-starter-json/2.3.3.RELEASE/spring-boot-starter-json-2.3.3.RELEASE.jar:/Users/qiunan/home/local/repo/com/fasterxml/jackson/core/jackson-databind/2.11.2/jackson-databind-2.11.2.jar:/Users/qiunan/home/local/repo/com/fasterxml/jackson/core/jackson-core/2.11.2/jackson-core-2.11.2.jar:/Users/qiunan/home/local/repo/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.11.2/jackson-datatype-jdk8-2.11.2.jar:/Users/qiunan/home/local/repo/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.11.2/jackson-datatype-jsr310-2.11.2.jar:/Users/qiunan/home/local/repo/com/fasterxml/jackson/module/jackson-module-parameter-names/2.11.2/jackson-module-parameter-names-2.11.2.jar:/Users/qiunan/home/local/repo/org/springframework/boot/spring-boot-starter-tomcat/2.3.3.RELEASE/spring-boot-starter-tomcat-2.3.3.RELEASE.jar:/Users/qiunan/home/local/repo/org/apache/tomcat/embed/tomcat-embed-core/9.0.37/tomcat-embed-core-9.0.37.jar:/Users/qiunan/home/local/repo/org/glassfish/jakarta.el/3.0.3/jakarta.el-3.0.3.jar:/Users/qiunan/home/local/repo/org/apache/tomcat/embed/tomcat-embed-websocket/9.0.37/tomcat-embed-websocket-9.0.37.jar:/Users/qiunan/home/local/repo/org/springframework/boot/spring-boot-starter-data-jpa/2.3.3.RELEASE/spring-boot-starter-data-jpa-2.3.3.RELEASE.jar:/Users/qiunan/home/local/repo/org/springframework/boot/spring-boot-starter-aop/2.3.3.RELEASE/spring-boot-starter-aop-2.3.3.RELEASE.jar:/Users/qiunan/home/local/repo/org/aspectj/aspectjweaver/1.9.6/aspectjweaver-1.9.6.jar:/Users/qiunan/home/local/repo/org/springframework/boot/spring-boot-starter-jdbc/2.3.3.RELEASE/spring-boot-starter-jdbc-2.3.3.RELEASE.jar:/Users/qiunan/home/local/repo/com/zaxxer/HikariCP/3.4.5/HikariCP-3.4.5.jar:/Users/qiunan/home/local/repo/org/springframework/spring-jdbc/5.2.8.RELEASE/spring-jdbc-5.2.8.RELEASE.jar:/Users/qiunan/home/local/repo/jakarta/transaction/jakarta.transaction-api/1.3.3/jakarta.transaction-api-1.3.3.jar:/Users/qiunan/home/local/repo/jakarta/persistence/jakarta.persistence-api/2.2.3/jakarta.persistence-api-2.2.3.jar:/Users/qiunan/home/local/repo/org/hibernate/hibernate-core/5.4.20.Final/hibernate-core-5.4.20.Final.jar:/Users/qiunan/home/local/repo/org/jboss/logging/jboss-logging/3.3.2.Final/jboss-logging-3.3.2.Final.jar:/Users/qiunan/home/local/repo/org/javassist/javassist/3.24.0-GA/javassist-3.24.0-GA.jar:/Users/qiunan/home/local/repo/net/bytebuddy/byte-buddy/1.10.10/byte-buddy-1.10.10.jar:/Users/qiunan/home/local/repo/antlr/antlr/2.7.7/antlr-2.7.7.jar:/Users/qiunan/home/local/repo/org/jboss/jandex/2.1.3.Final/jandex-2.1.3.Final.jar:/Users/qiunan/home/local/repo/org/dom4j/dom4j/2.1.3/dom4j-2.1.3.jar:/Users/qiunan/home/local/repo/org/hibernate/common/hibernate-commons-annotations/5.1.0.Final/hibernate-commons-annotations-5.1.0.Final.jar:/Users/qiunan/home/local/repo/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar:/Users/qiunan/home/local/repo/org/glassfish/jaxb/txw2/2.3.1/txw2-2.3.1.jar:/Users/qiunan/home/local/repo/com/sun/istack/istack-commons-runtime/3.0.7/istack-commons-runtime-3.0.7.jar:/Users/qiunan/home/local/repo/org/jvnet/staxex/stax-ex/1.8/stax-ex-1.8.jar:/Users/qiunan/home/local/repo/com/sun/xml/fastinfoset/FastInfoset/1.2.15/FastInfoset-1.2.15.jar:/Users/qiunan/home/local/repo/org/springframework/data/spring-data-jpa/2.3.3.RELEASE/spring-data-jpa-2.3.3.RELEASE.jar:/Users/qiunan/home/local/repo/org/springframework/data/spring-data-commons/2.3.3.RELEASE/spring-data-commons-2.3.3.RELEASE.jar:/Users/qiunan/home/local/repo/org/springframework/spring-orm/5.2.8.RELEASE/spring-orm-5.2.8.RELEASE.jar:/Users/qiunan/home/local/repo/org/springframework/spring-tx/5.2.8.RELEASE/spring-tx-5.2.8.RELEASE.jar:/Users/qiunan/home/local/repo/org/springframework/spring-aspects/5.2.8.RELEASE/spring-aspects-5.2.8.RELEASE.jar:/Users/qiunan/home/local/repo/mysql/mysql-connector-java/5.1.49/mysql-connector-java-5.1.49.jar:/Users/qiunan/home/local/repo/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar:/Users/qiunan/home/local/repo/org/apache/httpcomponents/httpclient/4.5.12/httpclient-4.5.12.jar:/Users/qiunan/home/local/repo/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13.jar:/Users/qiunan/home/local/repo/commons-logging/commons-logging/1.2/commons-logging-1.2.jar:/Users/qiunan/home/local/repo/commons-codec/commons-codec/1.11/commons-codec-1.11.jar:/Applications/IntelliJ IDEA Edu.app/Contents/lib/idea_rt.jar" com.cherry.Soft_Ref // Connected to the target VM, address: '127.0.0.1:63090', transport: 'socket' // [time] => 1602066284309 // [time] => 1602066284514 // [time] => 1602066284720 // [time] => 1602066284925 // [time] => 1602066285129 // [time] => 1602066285333 // [time] => 1602066285538 // [time] => 1602066285744 // [time] => 1602066285947 // 被GC回收 // 被GC回收 // 被GC回收 // 被GC回收 // 被GC回收 // 被GC回收 // 被GC回收 // 被GC回收 // [time] => 1602066286161 // [time] => 1602066286364 // [time] => 1602066286565 // [time] => 1602066286766 // [time] => 1602066286971 // [time] => 1602066287176 // 被GC回收 // 被GC回收 // 被GC回收 // 被GC回收 // 被GC回收 // 被GC回收 // [time] => 1602066287384 // [time] => 1602066287588 // [time] => 1602066287791 // [time] => 1602066287994 // [time] => 1602066288198 // Disconnected from the target VM, address: '127.0.0.1:63090', transport: 'socket' // // Process finished with exit code 0
从测试结果可以看出,当内存不够用或者将要不够用时,会触发GC,GC会自动的回收那些软引用指向对象。
一定要注意,软引用指向对象的回收是在触发GC的条件下才会被回收,如果内存够用,就算显式的调用GC,软引用指向的对象也不会被回收。
弱引用
弱引用的创建方式与软引用类似,需要借助于jdk中java.lang.ref.WeakReference
类去创建
弱引用的特点:
- 不管什么情况,遇到GC就会回收被弱引用指向的对象。
测试代码-5:
public class Weak_Ref { public static void main(String[] args) throws InterruptedException { // 堆内存没有设置,为默认状态 WeakReference<Memory> m = new WeakReference<>(new Memory(1024 * 1024 * 10)); // 调用GC System.gc(); Thread.sleep(1000); } } //被GC回收
虚引用
虚引用是一种十分特殊的引用,它主要用在堆外内存的管理,虚引用可以指向堆中的对象,但是没有实际的意义。
DirectByteBuffer是Java用于实现堆外内存的一个重要类,我们可以通过该类实现堆外内存的创建、使用和销毁。
当对象被回收时,通过Queue可以检测到,然后清理堆外内存。
虚引用的特点:
- 无法获取虚引用指向的对象的值。
- 虚引用在被GC回收时会有通知。
- 虚引用在遇到GC时,不管是否还有对象引用它,它都会被GC回收。
测试代码-6:
public class Phantom_Ref { static final ArrayList<byte[]> LIST = new ArrayList<>(); static final ReferenceQueue<Memory> QUEUE = new ReferenceQueue<>(); public static void main(String[] args) { PhantomReference<Memory> m = new PhantomReference<>(new Memory(1024 * 1024 * 10), QUEUE); new Thread(()->{ while (true) { LIST.add(new byte[1024 * 1024 ]); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); Thread.currentThread().interrupt(); } // 虚引用指向的值永远无法被获取 System.out.println(m.get()); } }).start(); new Thread(() -> { while (true) { Reference<? extends Memory> poll = QUEUE.poll(); if (poll != null) { //虚引用在对象被回收时,会进行通知 System.out.println("有虚引用被GC回收了-" + poll); break; } } }).start(); } } ///Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/bin/java -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:63862,suspend=y,server=n -Xmx20m -javaagent:/Users/qiunan/Library/Caches/IdeaIE2019.3/captureAgent/debugger-agent.jar -Dfile.encoding=UTF-8 -classpath "/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/deploy.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/ext/cldrdata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/ext/dnsns.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/ext/jaccess.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/ext/jfxrt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/ext/localedata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/ext/nashorn.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/ext/sunec.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/ext/zipfs.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/javaws.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/jfxswt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/management-agent.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/plugin.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/lib/ant-javafx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/lib/dt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/lib/javafx-mx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/lib/jconsole.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/lib/packager.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/lib/sa-jdi.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/lib/tools.jar:/Users/qiunan/IdeaProjects/ostream/ostream-web/target/classes:/Users/qiunan/home/local/repo/org/springframework/boot/spring-boot-configuration-processor/2.3.3.RELEASE/spring-boot-configuration-processor-2.3.3.RELEASE.jar:/Users/qiunan/home/local/repo/com/spring4all/swagger-spring-boot-starter/1.9.1.RELEASE/swagger-spring-boot-starter-1.9.1.RELEASE.jar:/Users/qiunan/home/local/repo/io/springfox/springfox-swagger-ui/2.9.2/springfox-swagger-ui-2.9.2.jar:/Users/qiunan/home/local/repo/io/springfox/springfox-spring-web/2.9.2/springfox-spring-web-2.9.2.jar:/Users/qiunan/home/local/repo/io/springfox/springfox-swagger2/2.9.2/springfox-swagger2-2.9.2.jar:/Users/qiunan/home/local/repo/io/swagger/swagger-annotations/1.5.20/swagger-annotations-1.5.20.jar:/Users/qiunan/home/local/repo/io/springfox/springfox-spi/2.9.2/springfox-spi-2.9.2.jar:/Users/qiunan/home/local/repo/io/springfox/springfox-core/2.9.2/springfox-core-2.9.2.jar:/Users/qiunan/home/local/repo/io/springfox/springfox-schema/2.9.2/springfox-schema-2.9.2.jar:/Users/qiunan/home/local/repo/io/springfox/springfox-swagger-common/2.9.2/springfox-swagger-common-2.9.2.jar:/Users/qiunan/home/local/repo/com/google/guava/guava/20.0/guava-20.0.jar:/Users/qiunan/home/local/repo/com/fasterxml/classmate/1.4.0/classmate-1.4.0.jar:/Users/qiunan/home/local/repo/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar:/Users/qiunan/home/local/repo/org/springframework/plugin/spring-plugin-core/1.2.0.RELEASE/spring-plugin-core-1.2.0.RELEASE.jar:/Users/qiunan/home/local/repo/org/springframework/plugin/spring-plugin-metadata/1.2.0.RELEASE/spring-plugin-metadata-1.2.0.RELEASE.jar:/Users/qiunan/home/local/repo/org/mapstruct/mapstruct/1.2.0.Final/mapstruct-1.2.0.Final.jar:/Users/qiunan/home/local/repo/io/swagger/swagger-models/1.5.24/swagger-models-1.5.24.jar:/Users/qiunan/home/local/repo/com/fasterxml/jackson/core/jackson-annotations/2.9.10/jackson-annotations-2.9.10.jar:/Users/qiunan/home/local/repo/io/springfox/springfox-bean-validators/2.9.2/springfox-bean-validators-2.9.2.jar:/Users/qiunan/home/local/repo/org/springframework/spring-webmvc/5.2.8.RELEASE/spring-webmvc-5.2.8.RELEASE.jar:/Users/qiunan/home/local/repo/org/springframework/spring-aop/5.2.8.RELEASE/spring-aop-5.2.8.RELEASE.jar:/Users/qiunan/home/local/repo/org/springframework/spring-beans/5.2.8.RELEASE/spring-beans-5.2.8.RELEASE.jar:/Users/qiunan/home/local/repo/org/springframework/spring-context/5.2.8.RELEASE/spring-context-5.2.8.RELEASE.jar:/Users/qiunan/home/local/repo/org/springframework/spring-core/5.2.8.RELEASE/spring-core-5.2.8.RELEASE.jar:/Users/qiunan/home/local/repo/org/springframework/spring-jcl/5.2.8.RELEASE/spring-jcl-5.2.8.RELEASE.jar:/Users/qiunan/home/local/repo/org/springframework/spring-expression/5.2.8.RELEASE/spring-expression-5.2.8.RELEASE.jar:/Users/qiunan/home/local/repo/org/springframework/spring-web/5.2.8.RELEASE/spring-web-5.2.8.RELEASE.jar:/Users/qiunan/home/local/repo/org/springframework/boot/spring-boot-starter-web/2.3.3.RELEASE/spring-boot-starter-web-2.3.3.RELEASE.jar:/Users/qiunan/home/local/repo/org/springframework/boot/spring-boot-starter/2.3.3.RELEASE/spring-boot-starter-2.3.3.RELEASE.jar:/Users/qiunan/home/local/repo/org/springframework/boot/spring-boot/2.3.3.RELEASE/spring-boot-2.3.3.RELEASE.jar:/Users/qiunan/home/local/repo/org/springframework/boot/spring-boot-autoconfigure/2.3.3.RELEASE/spring-boot-autoconfigure-2.3.3.RELEASE.jar:/Users/qiunan/home/local/repo/org/springframework/boot/spring-boot-starter-logging/2.3.3.RELEASE/spring-boot-starter-logging-2.3.3.RELEASE.jar:/Users/qiunan/home/local/repo/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar:/Users/qiunan/home/local/repo/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar:/Users/qiunan/home/local/repo/org/apache/logging/log4j/log4j-to-slf4j/2.13.3/log4j-to-slf4j-2.13.3.jar:/Users/qiunan/home/local/repo/org/apache/logging/log4j/log4j-api/2.13.3/log4j-api-2.13.3.jar:/Users/qiunan/home/local/repo/org/slf4j/jul-to-slf4j/1.7.30/jul-to-slf4j-1.7.30.jar:/Users/qiunan/home/local/repo/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar:/Users/qiunan/home/local/repo/org/yaml/snakeyaml/1.26/snakeyaml-1.26.jar:/Users/qiunan/home/local/repo/org/springframework/boot/spring-boot-starter-json/2.3.3.RELEASE/spring-boot-starter-json-2.3.3.RELEASE.jar:/Users/qiunan/home/local/repo/com/fasterxml/jackson/core/jackson-databind/2.11.2/jackson-databind-2.11.2.jar:/Users/qiunan/home/local/repo/com/fasterxml/jackson/core/jackson-core/2.11.2/jackson-core-2.11.2.jar:/Users/qiunan/home/local/repo/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.11.2/jackson-datatype-jdk8-2.11.2.jar:/Users/qiunan/home/local/repo/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.11.2/jackson-datatype-jsr310-2.11.2.jar:/Users/qiunan/home/local/repo/com/fasterxml/jackson/module/jackson-module-parameter-names/2.11.2/jackson-module-parameter-names-2.11.2.jar:/Users/qiunan/home/local/repo/org/springframework/boot/spring-boot-starter-tomcat/2.3.3.RELEASE/spring-boot-starter-tomcat-2.3.3.RELEASE.jar:/Users/qiunan/home/local/repo/org/apache/tomcat/embed/tomcat-embed-core/9.0.37/tomcat-embed-core-9.0.37.jar:/Users/qiunan/home/local/repo/org/glassfish/jakarta.el/3.0.3/jakarta.el-3.0.3.jar:/Users/qiunan/home/local/repo/org/apache/tomcat/embed/tomcat-embed-websocket/9.0.37/tomcat-embed-websocket-9.0.37.jar:/Users/qiunan/home/local/repo/org/springframework/boot/spring-boot-starter-data-jpa/2.3.3.RELEASE/spring-boot-starter-data-jpa-2.3.3.RELEASE.jar:/Users/qiunan/home/local/repo/org/springframework/boot/spring-boot-starter-aop/2.3.3.RELEASE/spring-boot-starter-aop-2.3.3.RELEASE.jar:/Users/qiunan/home/local/repo/org/aspectj/aspectjweaver/1.9.6/aspectjweaver-1.9.6.jar:/Users/qiunan/home/local/repo/org/springframework/boot/spring-boot-starter-jdbc/2.3.3.RELEASE/spring-boot-starter-jdbc-2.3.3.RELEASE.jar:/Users/qiunan/home/local/repo/com/zaxxer/HikariCP/3.4.5/HikariCP-3.4.5.jar:/Users/qiunan/home/local/repo/org/springframework/spring-jdbc/5.2.8.RELEASE/spring-jdbc-5.2.8.RELEASE.jar:/Users/qiunan/home/local/repo/jakarta/transaction/jakarta.transaction-api/1.3.3/jakarta.transaction-api-1.3.3.jar:/Users/qiunan/home/local/repo/jakarta/persistence/jakarta.persistence-api/2.2.3/jakarta.persistence-api-2.2.3.jar:/Users/qiunan/home/local/repo/org/hibernate/hibernate-core/5.4.20.Final/hibernate-core-5.4.20.Final.jar:/Users/qiunan/home/local/repo/org/jboss/logging/jboss-logging/3.3.2.Final/jboss-logging-3.3.2.Final.jar:/Users/qiunan/home/local/repo/org/javassist/javassist/3.24.0-GA/javassist-3.24.0-GA.jar:/Users/qiunan/home/local/repo/net/bytebuddy/byte-buddy/1.10.10/byte-buddy-1.10.10.jar:/Users/qiunan/home/local/repo/antlr/antlr/2.7.7/antlr-2.7.7.jar:/Users/qiunan/home/local/repo/org/jboss/jandex/2.1.3.Final/jandex-2.1.3.Final.jar:/Users/qiunan/home/local/repo/org/dom4j/dom4j/2.1.3/dom4j-2.1.3.jar:/Users/qiunan/home/local/repo/org/hibernate/common/hibernate-commons-annotations/5.1.0.Final/hibernate-commons-annotations-5.1.0.Final.jar:/Users/qiunan/home/local/repo/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar:/Users/qiunan/home/local/repo/org/glassfish/jaxb/txw2/2.3.1/txw2-2.3.1.jar:/Users/qiunan/home/local/repo/com/sun/istack/istack-commons-runtime/3.0.7/istack-commons-runtime-3.0.7.jar:/Users/qiunan/home/local/repo/org/jvnet/staxex/stax-ex/1.8/stax-ex-1.8.jar:/Users/qiunan/home/local/repo/com/sun/xml/fastinfoset/FastInfoset/1.2.15/FastInfoset-1.2.15.jar:/Users/qiunan/home/local/repo/org/springframework/data/spring-data-jpa/2.3.3.RELEASE/spring-data-jpa-2.3.3.RELEASE.jar:/Users/qiunan/home/local/repo/org/springframework/data/spring-data-commons/2.3.3.RELEASE/spring-data-commons-2.3.3.RELEASE.jar:/Users/qiunan/home/local/repo/org/springframework/spring-orm/5.2.8.RELEASE/spring-orm-5.2.8.RELEASE.jar:/Users/qiunan/home/local/repo/org/springframework/spring-tx/5.2.8.RELEASE/spring-tx-5.2.8.RELEASE.jar:/Users/qiunan/home/local/repo/org/springframework/spring-aspects/5.2.8.RELEASE/spring-aspects-5.2.8.RELEASE.jar:/Users/qiunan/home/local/repo/mysql/mysql-connector-java/5.1.49/mysql-connector-java-5.1.49.jar:/Users/qiunan/home/local/repo/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar:/Users/qiunan/home/local/repo/org/apache/httpcomponents/httpclient/4.5.12/httpclient-4.5.12.jar:/Users/qiunan/home/local/repo/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13.jar:/Users/qiunan/home/local/repo/commons-logging/commons-logging/1.2/commons-logging-1.2.jar:/Users/qiunan/home/local/repo/commons-codec/commons-codec/1.11/commons-codec-1.11.jar:/Applications/IntelliJ IDEA Edu.app/Contents/lib/idea_rt.jar" com.cherry.Phantom_Ref // Connected to the target VM, address: '127.0.0.1:63862', transport: 'socket' // 被GC回收 // null // null // null // null // 有虚引用被GC回收了-java.lang.ref.PhantomReference@5be60800 // null // null // null // null // Exception in thread "Thread-0" java.lang.OutOfMemoryError: Java heap space // at com.cherry.Phantom_Ref.lambda$main$0(Phantom_Ref.java:24) // at com.cherry.Phantom_Ref$$Lambda$1/1781256139.run(Unknown Source) // at java.lang.Thread.run(Thread.java:748) // Disconnected from the target VM, address: '127.0.0.1:63862', transport: 'socket' // // Process finished with exit code 0