认知jvm的内存泄漏和溢出

本文探讨了Java中的内存泄漏和内存溢出问题。内存泄漏发生在对象不再使用但引用仍然存在,阻止GC回收。示例代码显示即使设置对象为null,由于ArrayList持有引用,GC仍无法回收。解决方法是通过多线程,让线程结束时自动释放内存。内存溢出是由于不断向集合添加数据而未进行垃圾回收导致的。解决建议是增大JVM内存。文章还提供了内存溢出的异常堆栈跟踪。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,内存泄漏

public class Test {
    public static void main(String[] args) {
        ArrayList list=new ArrayList();
        for (int i=0;i<100;i++){
            //栈中有一个内存地址,指向Users对象
            Users user = new Users();
            list.add(user);
            //将内存地址赋值为空
            user=null;
        }
        //通知gc垃圾回收
        System.gc();
    }
}

如上代码,gc是无法进行垃圾回收的,因为User类虽然在栈空间中的内存地址被清空了,但是在ArrayList的数组中(arrayList底层是一个数组),依旧存放了内存地址,gc是无法回收正在使用的对象的。

我们称这种现象为,内存泄漏。

1.1,内存泄漏的解决方法

public class Test{
    public static void main(String[] args) {
​
        new Thread(){
            @Override
            public synchronized void start() {
                ArrayList list=new ArrayList();
                list.add(new Users());
            }
        }.start();
    }
}

利用多线程的方式,线程死亡,自动释放掉内存,就不会存在内存泄露问题。

2,内存溢出

import java.util.ArrayList;
​
public class Test{
    public static void main(String[] args) {
        ArrayList list=new ArrayList();
        //无限次的往集合中存入数据,就会导致内存溢出
        while (true){
            list.add(new Users());
        }
    }
}

无限次的往集合中存入数据,且不进行gc回收垃圾,就会内存溢出。

错误

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:3210) at java.util.Arrays.copyOf(Arrays.java:3181) at java.util.ArrayList.grow(ArrayList.java:267) at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:241) at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:233) at java.util.ArrayList.add(ArrayList.java:464) at Test.main(Test.java:7)

2.1,内存溢出的解决方法

将jvm的内存扩容

 

VM options加上参数:

-server -XX:PermSize=1024M -XX:MaxPermSize=jvm内存大小m(单位mb)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值