编辑
2020-06-04
编程
00

目录

reference
1. 四种引用
1.1 强引用
1.2 软引用
1.3 弱引用
1.4 虚引用

reference

1. 四种引用

1.1 强引用

使用:正常声明一个变量即为强引用

GC:不会被回收,引用指向 null 时中断关联,会导致 OOM

src

java
/** * vm 参数: -Xms20M -Xmx20M -Xmn10M -verbose:gc -XX:+PrintGCDetails * 强引用: * java.lang.OutOfMemoryError */ public static void strongReference() { List<Object> list = new ArrayList<>(); for (int i = 0; i < 21; i++) { list.add(new byte[1024 * 1024]); } }

print

text
[GC (Allocation Failure) [PSYoungGen: 7295K->776K(9216K)] 7295K->5904K(19456K), 0.0118353 secs] [Times: user=0.05 sys=0.00, real=0.01 secs] [Full GC (Ergonomics) [PSYoungGen: 776K->0K(9216K)] [ParOldGen: 5128K->5785K(10240K)] 5904K->5785K(19456K), [Metaspace: 3489K->3489K(1056768K)], 0.0103363 secs] [Times: user=0.03 sys=0.00, real=0.01 secs] [Full GC (Ergonomics) [PSYoungGen: 7324K->3072K(9216K)] [ParOldGen: 5785K->9875K(10240K)] 13110K->12947K(19456K), [Metaspace: 3489K->3489K(1056768K)], 0.0128192 secs] [Times: user=0.03 sys=0.00, real=0.01 secs] [Full GC (Ergonomics) [PSYoungGen: 7481K->7168K(9216K)] [ParOldGen: 9875K->9875K(10240K)] 17357K->17044K(19456K), [Metaspace: 3489K->3489K(1056768K)], 0.0094613 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] [Full GC (Allocation Failure) [PSYoungGen: 7168K->7168K(9216K)] [ParOldGen: 9875K->9856K(10240K)] 17044K->17024K(19456K), [Metaspace: 3489K->3489K(1056768K)], 0.0101369 secs] [Times: user=0.01 sys=0.00, real=0.01 secs] Heap PSYoungGen total 9216K, used 7379K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000) eden space 8192K, 90% used [0x00000000ff600000,0x00000000ffd34d70,0x00000000ffe00000) from space 1024K, 0% used [0x00000000ffe00000,0x00000000ffe00000,0x00000000fff00000) to space 1024K, 0% used [0x00000000fff00000,0x00000000fff00000,0x0000000100000000) ParOldGen total 10240K, used 9856K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000) object space 10240K, 96% used [0x00000000fec00000,0x00000000ff5a0210,0x00000000ff600000) Metaspace used 3522K, capacity 4570K, committed 4864K, reserved 1056768K class space used 391K, capacity 394K, committed 512K, reserved 1048576K Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at com.yui.study.reference.BaseUseReference.strongReference(BaseUseReference.java:32) at com.yui.study.reference.BaseUseReference.main(BaseUseReference.java:18)

1.2 软引用

使用:SoftReference<>

GC:如果内存足够,就不会被回收;如果内存不够用,会被回收。不会 OOM

src

java
/** * 软引用 * 1.软引用,当GC的时候,如果GC Root可达,如果内存足够,就不会被回收; * 如果内存不够用,会被回收。不会 OOM * 2.应用于缓存。 */ public static void softReference() { List<SoftReference<byte[]>> list = new ArrayList<>(); for (int i = 0; i < 21; i++) { SoftReference<byte[]> softReference = new SoftReference<>(new byte[1024 * 1024]); list.add(softReference); System.out.println("insert data:" + softReference.get()); } // 触发 gc ,之后被回收,剩下未被回收的数据 list.forEach(temp -> System.out.println("before gc:" + temp.get())); // 主动 gc 时,内存足够,数据没有变化 System.gc(); list.forEach(temp -> System.out.println("after gc:" + temp.get())); }

print

text
insert data:[B@6d6f6e28 insert data:[B@135fbaa4 insert data:[B@45ee12a7 insert data:[B@330bedb4 insert data:[B@2503dbd3 [GC (Allocation Failure) [PSYoungGen: 7295K->696K(9216K)] 7295K->5824K(19456K), 0.0066160 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] [Full GC (Ergonomics) [PSYoungGen: 696K->0K(9216K)] [ParOldGen: 5128K->5761K(10240K)] 5824K->5761K(19456K), [Metaspace: 3476K->3476K(1056768K)], 0.0198913 secs] [Times: user=0.05 sys=0.00, real=0.02 secs] insert data:[B@4b67cf4d insert data:[B@7ea987ac insert data:[B@12a3a380 insert data:[B@29453f44 insert data:[B@5cad8086 insert data:[B@6e0be858 insert data:[B@61bbe9ba [Full GC (Ergonomics) [PSYoungGen: 7408K->3072K(9216K)] [ParOldGen: 5761K->9852K(10240K)] 13170K->12924K(19456K), [Metaspace: 3484K->3484K(1056768K)], 0.0175418 secs] [Times: user=0.02 sys=0.00, real=0.02 secs] insert data:[B@610455d6 insert data:[B@511d50c0 insert data:[B@60e53b93 insert data:[B@5e2de80c [Full GC (Ergonomics) [PSYoungGen: 7543K->7192K(9216K)] [ParOldGen: 9852K->9852K(10240K)] 17396K->17044K(19456K), [Metaspace: 3490K->3490K(1056768K)], 0.0131124 secs] [Times: user=0.03 sys=0.00, real=0.01 secs] [Full GC (Allocation Failure) [PSYoungGen: 7192K->0K(9216K)] [ParOldGen: 9852K->641K(10240K)] 17044K->641K(19456K), [Metaspace: 3490K->3490K(1056768K)], 0.0064228 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] insert data:[B@1d44bcfa insert data:[B@266474c2 insert data:[B@6f94fa3e insert data:[B@5e481248 insert data:[B@66d3c617 before gc:null before gc:null before gc:null before gc:null before gc:null before gc:null before gc:null before gc:null before gc:null before gc:null before gc:null before gc:null before gc:null before gc:null before gc:null before gc:null before gc:[B@1d44bcfa before gc:[B@266474c2 before gc:[B@6f94fa3e before gc:[B@5e481248 before gc:[B@66d3c617 [GC (System.gc()) [PSYoungGen: 7087K->224K(9216K)] 7728K->5993K(19456K), 0.0053839 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] [Full GC (System.gc()) [PSYoungGen: 224K->0K(9216K)] [ParOldGen: 5769K->5963K(10240K)] 5993K->5963K(19456K), [Metaspace: 4371K->4371K(1056768K)], 0.0242743 secs] [Times: user=0.00 sys=0.00, real=0.02 secs] after gc:null after gc:null after gc:null after gc:null after gc:null after gc:null after gc:null after gc:null after gc:null after gc:null after gc:null after gc:null after gc:null after gc:null after gc:null after gc:null after gc:[B@1d44bcfa after gc:[B@266474c2 after gc:[B@6f94fa3e after gc:[B@5e481248 after gc:[B@66d3c617 Heap PSYoungGen total 9216K, used 224K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000) eden space 8192K, 2% used [0x00000000ff600000,0x00000000ff638230,0x00000000ffe00000) from space 1024K, 0% used [0x00000000fff00000,0x00000000fff00000,0x0000000100000000) to space 1024K, 0% used [0x00000000ffe00000,0x00000000ffe00000,0x00000000fff00000) ParOldGen total 10240K, used 5963K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000) object space 10240K, 58% used [0x00000000fec00000,0x00000000ff1d2c88,0x00000000ff600000) Metaspace used 4385K, capacity 4780K, committed 4992K, reserved 1056768K class space used 494K, capacity 532K, committed 640K, reserved 1048576K

1.3 弱引用

使用:WeakReference<>

GC:只要发生GC,就会被回收。不会 OOM

src

java
/** * 弱引用 * 1.软引用,只要这个对象发生GC,就会被回收。 * 2.WeakHashMap * 3.ThreadLocalMap ThreadLocal * 4.Tomcat ConcurrentCache ConcurrentHashMap */ public static void weakReference() { List<WeakReference<byte[]>> list = new LinkedList<>(); for (int i = 0; i < 21; i++) { WeakReference<byte[]> weakReference = new WeakReference<>(new byte[1024 * 1024]); list.add(weakReference); System.out.println("insert data:" + weakReference.get()); } // gc 之后已存在的全部被回收,剩下后边插入未被 gc 的数据 list.forEach(temp -> System.out.println("before gc:" + temp.get())); // 主动 gc 之后全部被回收 System.gc(); list.forEach(temp -> System.out.println("after gc:" + temp.get())); }

print

text
insert data:[B@6d6f6e28 insert data:[B@135fbaa4 insert data:[B@45ee12a7 insert data:[B@330bedb4 insert data:[B@2503dbd3 [GC (Allocation Failure) [PSYoungGen: 7295K->712K(9216K)] 7295K->720K(19456K), 0.0175392 secs] [Times: user=0.02 sys=0.00, real=0.02 secs] insert data:[B@4b67cf4d insert data:[B@7ea987ac insert data:[B@12a3a380 insert data:[B@29453f44 insert data:[B@5cad8086 insert data:[B@6e0be858 insert data:[B@61bbe9ba [GC (Allocation Failure) [PSYoungGen: 8120K->728K(9216K)] 8128K->736K(19456K), 0.0018292 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] insert data:[B@610455d6 insert data:[B@511d50c0 insert data:[B@60e53b93 insert data:[B@5e2de80c insert data:[B@1d44bcfa insert data:[B@266474c2 insert data:[B@6f94fa3e [GC (Allocation Failure) [PSYoungGen: 8273K->760K(9216K)] 8281K->768K(19456K), 0.0013182 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] insert data:[B@5e481248 insert data:[B@66d3c617 before gc:null before gc:null before gc:null before gc:null before gc:null before gc:null before gc:null before gc:null before gc:null before gc:null before gc:null before gc:null before gc:null before gc:null before gc:null before gc:null before gc:null before gc:null before gc:null before gc:[B@5e481248 before gc:[B@66d3c617 [GC (System.gc()) [PSYoungGen: 4872K->952K(9216K)] 4880K->968K(19456K), 0.0018430 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] [Full GC (System.gc()) [PSYoungGen: 952K->0K(9216K)] [ParOldGen: 16K->862K(10240K)] 968K->862K(19456K), [Metaspace: 4376K->4376K(1056768K)], 0.0123685 secs] [Times: user=0.02 sys=0.00, real=0.01 secs] after gc:null after gc:null after gc:null after gc:null after gc:null after gc:null after gc:null after gc:null after gc:null after gc:null after gc:null after gc:null after gc:null after gc:null after gc:null after gc:null after gc:null after gc:null after gc:null after gc:null after gc:null Heap PSYoungGen total 9216K, used 238K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000) eden space 8192K, 2% used [0x00000000ff600000,0x00000000ff63b998,0x00000000ffe00000) from space 1024K, 0% used [0x00000000fff00000,0x00000000fff00000,0x0000000100000000) to space 1024K, 0% used [0x00000000ffe00000,0x00000000ffe00000,0x00000000fff00000) ParOldGen total 10240K, used 862K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000) object space 10240K, 8% used [0x00000000fec00000,0x00000000fecd7940,0x00000000ff600000) Metaspace used 4386K, capacity 4780K, committed 4992K, reserved 1056768K class space used 495K, capacity 532K, committed 640K, reserved 1048576K

1.4 虚引用

使用:ReferenceQueue,PhantomReference<>

GC:正常引用gc,当实例被回收时,会往关联的 ReferenceQueue 放入一个引用,通知实例被回收

src

java
public static void phantomReference() { ReferenceQueue<AccountDto> queue = new ReferenceQueue<>(); List<byte[]> list = new ArrayList<>(); String test01 = "测试对象1"; AccountDto accountDto = new AccountDto(); accountDto.setUsername("测试对象1"); PhantomReference<AccountDto> reference = new PhantomReference<>(accountDto, queue); new Thread(() -> { while (true) { Reference<? extends AccountDto> poll = queue.poll(); if (poll != null) { System.out.println("############对象被回收了: " + poll.get()); break; } } }).start(); new Thread(() -> { while (true) { list.add(new byte[1024 * 1024]); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); Thread.currentThread().interrupt(); } AccountDto s = reference.get(); System.out.println("正常输出:" + s); } }).start(); // 是引用失效,让gc回收实例,触发通知 accountDto = null; System.out.println("test-end"); try { Thread.currentThread().join(); } catch (InterruptedException e) { e.printStackTrace(); System.exit(1); } }

print

text
test-end 正常输出:null 正常输出:null [GC (Allocation Failure) [PSYoungGen: 7519K->1016K(9216K)] 7519K->3288K(19456K), 0.0151290 secs] [Times: user=0.05 sys=0.00, real=0.02 secs] ############对象被回收了: null 正常输出:null 正常输出:null 正常输出:null ...

本文作者:Yui_HTT

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.14.8