使用:正常声明一个变量即为强引用
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]);
}
}
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)
使用: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()));
}
textinsert 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
使用: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()));
}
textinsert 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
使用: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);
}
}
texttest-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 许可协议。转载请注明出处!
预览: