代码拉取完成,页面将自动刷新
同步操作将从 flatfish/Java-Review 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
Java中有四种引用类型,分别是如下四种
// 只要 o 还指向Object对象,对象 o 就不会被GC回收
Object o = new Object();
o = null;
-Xms2M -Xmx3M
JVM初始内存设为2M,最大可用内存为3M/**
* VM参数:-Xms2M -Xmx3M
*/
public class Test2 {
public static void main(String[] args) {
byte[] bytes = new byte[1024 * 1024 * 3];
}
}
// Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
/**
* VM参数:-Xms2M -Xmx3M
*/
public class TestSoftReferenceOom {
private static List<Object> list = new ArrayList();
public static void main(String[] args) {
testReferenceOom();
}
public static void testReferenceOom() {
for (int i = 0; i < 10; i++) {
byte[] b = new byte[1024 * 1024];
SoftReference<byte[]> reference = new SoftReference<>(b);
list.add(reference);
}
// 触发一次GC 注意:并不是一定会立刻执行GC
System.gc();
for (int i = 0; i < list.size(); i++) {
Object obj = ((SoftReference) list.get(i)).get();
System.out.print(obj + " ");
}
}
}
// null null null null null null null null null [B@1540e19d
/**
* VM参数:-Xms2M -Xmx3M
*/
public class TestSoftReferenceOom {
private static List<Object> list = new ArrayList();
public static void main(String[] args) {
testReferenceOom();
}
public static void testReferenceOom() {
byte[] b = null;
for (int i = 0; i < 10; i++) {
b = new byte[1024 * 1024];
SoftReference<byte[]> reference = new SoftReference<>(b);
list.add(reference);
}
// 触发一次GC 注意:并不是一定会立刻执行GC
System.gc();
for (int i = 0; i < list.size(); i++) {
Object obj = ((SoftReference) list.get(i)).get();
System.out.print(obj + " ");
}
}
}
// Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
/**
* VM参数:-Xms2M -Xmx3M
*/
public class TestSoftReferenceOom {
private static List<Object> list = new ArrayList();
public static void main(String[] args) {
testWeakReferenceOom();
}
public static void testWeakReferenceOom() {
for (int i = 0; i < 10; i++) {
byte[] b = new byte[1024 * 1024];
WeakReference<byte[]> reference = new WeakReference<>(b);
list.add(reference);
}
System.gc();
for (int i = 0; i < list.size(); i++) {
Object obj = ((WeakReference) list.get(i)).get();
System.out.print(obj + " ");
}
}
}
// null null null null null null null null null null
public class PhantomReference<T> extends Reference<T> {
public T get() {
return null;
}
public PhantomReference(T referent, ReferenceQueue<? super T> q) {
super(referent, q);
}
}
public void test() {
Map map;
// 弱引用 HashMap
map = new WeakHashMap();
for (int i = 0; i < 10000; i++) {
map.put("key" + i, new byte[i]);
}
// 强引用HashMap
map = new HashMap();
for (int i = 0; i < 10000; i++) {
map.put("key" + i, new byte[i]);
}
}
类型 | 回收时间 | 使用场景 |
---|---|---|
强引用 | 一直存活,除非GC Roots不可达 | 所有程序的场景,基本对象,自定义对象等。 |
软引用 | 内存不足时会被回收 | 一般用在对内存非常敏感的资源上,用作缓存的场景比较多,例如:网页缓存、图片缓存 |
弱引用 | 只能存活到下一次GC前 | 生命周期很短的对象,例如ThreadLocal中的Key。 |
虚引用 | 随时会被回收, 创建了可能很快就会被回收 | 业界暂无使用场景, 可能被JVM团队内部用来跟踪JVM的垃圾回收活动 |
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。