版权声明:本文为博主原创文章,未经博主允许不得转载 https://blog.csdn.net/gs_albb/article/details/88749409
一直以来以为当java应用程序的内存溢出后,整个jvm就会停止工作,最近做了个小实验发现并不是这样。
java弱引用
一段示例代码如下:
/**
* 弱引用
* -Xms5m -Xmx10m 时抛出
* Exception in thread "Thread-0" java.lang.OutOfMemoryError: GC overhead limit exceeded
*
*/
public class Reference1 {
public static void main(String[] args) {
Object obj = new Object();
WeakReference<Object> wf = new WeakReference<>(obj);
obj = null;
List<String> list = new ArrayList<>();
new Thread(new Runnable() {
@Override
public void run() {
while (true){
try {
Thread.sleep(1);
//被垃圾回收器回收则返回null
System.out.println(wf.get());
//返回是否被垃圾回收器标记为即将回收的垃圾
//由于发生在瞬时间,很难验证返回true
System.out.println(wf.isEnqueued());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
new Thread(() -> {
for (int i = 0; i < 1000000000; i++) {
try{
list.add(new String(i + ""));
//Thread.sleep(1);
}catch (Exception e){
System.out.println("发生异常");
}
}
}).start();
}
}
这里使用了弱引用,弱引用关联的对象只能生存到下次垃圾收集发生之前。执行一段时间之后,第二个线程由于不停的创建String对象,被list所引用无法释放,发生内存溢出。
Exception in thread “Thread-1” java.lang.OutOfMemoryError: GC overhead limit exceeded
而第一个线程仍然不受影响,继续打印输出。