文章目录
- 1. System.gc()的理解
- 2.内存溢出与内存泄漏
- 3. Stop The World
- 4. 并发与并行
- 5. 安全点与安全区域的说明
- 6. 强引用、软引用、弱引用、虚引用
1. System.gc()的理解
2.内存溢出与内存泄漏
3. Stop The World
4. 并发与并行
5. 安全点与安全区域的说明
6. 强引用、软引用、弱引用、虚引用
强引用
软引用
SoftReference userSoftRef = new SoftReference(new User(1, “songhk”));
//上面的一行代码,等价于如下的三行代码
User u1 = new User(1,“songhk”);
SoftReference userSoftRef = new SoftReference(u1);
u1 = null;//取消强引用
**
* 软引用的测试:内存不足即回收
*
* @author shkstart shkstart@126.com
* @create 2020 16:06
*/
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,"songhk");
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());//由于堆空间内存足够,所有不会回收软引用的可达对象。
//
try {
//让系统认为内存资源紧张、不够
// byte[] b = new byte[1024 * 1024 * 7];
byte[] b = new byte[1024 * 7168 - 635 * 1024];
} catch (Throwable e) {
e.printStackTrace();
} finally {
//再次从软引用中获取数据
System.out.println(userSoftRef.get());//在报OOM之前,垃圾回收器会回收软引用的可达对象。
}
}
}
弱引用
弱引用和软引用的区别:弱引用发生GC就回收,软引用内存不足才回收。发生GC不代表就内存不足了,还需要通过算法检查。
虚引用
注:本文是学习 尚硅谷宋红康JVM全套教程(详解java虚拟机)所做笔记。