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)
|