测试代码
package com.example.demo.entity;
import java.lang.ref.SoftReference;
/**
* 软引用的测试:内存不足即回收
* -Xmx10m -Xms10m -XX:+PrintGCDetails
*/
public class SoftReferenceTest {
public static class User {
public User(int id, String name) {
this.id = id;
this.name = name;
}
public int id;
public String name;
@Override
public String toString() {
return "[id=" + id + ", name=" + name + "] ";
}
}
public static void main(String[] args) {
// 创建对象,建立软引用
// SoftReference<User> userSoftRef = new SoftReference<User>(new User(1, "songhk"));
// 上面的一行代码,等价于如下的三行代码
User u1 = new User(1, "cakin");
SoftReference<User> userSoftRef = new SoftReference<User>(u1);
u1 = null;//取消强引用
// 从软引用中重新获得强引用对象
System.out.println(userSoftRef.get());
System.gc();
System.out.println("内存足够:After GC:");
// 垃圾回收之后获得软引用中的对象
System.out.println(userSoftRef.get()); // 由于堆空间内存足够,所以不会回收软引用的可达对象。
System.out.println("内存紧张或不足:After GC:");
try {
// 让系统认为内存资源不够 a
// byte[] b = new byte[1024 * 1024 * 7];
// 让系统认为内存资源紧张 b
byte[] b = new byte[1024 * 1024 * 6];
} catch (Throwable e) {
e.printStackTrace();
} finally {
// 再次从软引用中获取数据
System.out.println(userSoftRef.get()); // 在报 OOM 之前,垃圾回收器会回收软引用的可达对象。
}
}
}
设置
idea 设置VM选项 -Xmx10m -Xms10m -XX:+PrintGCDetails
GC面板
Heap
PSYoungGen total 2560K, used 185K [0x00000000ffd00000, 0x0000000100000000, 0x0000000100000000)
eden space 2048K, 9% used [0x00000000ffd00000,0x00000000ffd2e410,0x00000000fff00000)
from space 512K, 0% used [0x00000000fff80000,0x00000000fff80000,0x0000000100000000)
to space 512K, 0% used [0x00000000fff00000,0x00000000fff00000,0x00000000fff80000)
ParOldGen total 7168K, used 7031K [0x00000000ff600000, 0x00000000ffd00000, 0x00000000ffd00000)
object space 7168K, 98% used [0x00000000ff600000,0x00000000ffcddde8,0x00000000ffd00000)
Metaspace used 3375K, capacity 4500K, committed 4864K, reserved 1056768K
class space used 366K, capacity 388K, committed 512K, reserved 1048576K
1.PSYoungGen:新生代为2560K
2.新生代又分为eden区 2048K,和s0区(from space)512K,s1区(to space)512K。
3.ParOldGen:老年代7168K
4.Metaspace:元空间
- Xmx设置10M, 老年代跟新生代默认比例是7:3; (7168:3072)
- 新生代 E区跟S区的比例是2:1 (2048:1024)
- S区的S0 S1比例是1:1 (512:512)