jvm内存溢出会导致jvm停止工作吗

版权声明:本文为博主原创文章,未经博主允许不得转载 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

而第一个线程仍然不受影响,继续打印输出。

猜你喜欢

转载自blog.csdn.net/gs_albb/article/details/88749409
今日推荐