4.1 什么内存泄漏?什么是内存溢出?
内存溢出
程序在申请内存的时候,没有足够的内存空间可以使用就会抛出OutOfMemory错误;
比如申请一个8M的空间,但是当前内存可用空间只有5MB,那么就是内存溢出;
OutOfMemoryError:指没有空闲内存,垃圾收集器回收后也不能提供更多的内存空间;
内存溢出
程序运行后,没有释放所占用的内存空间(某些引用没有释放就不能被垃圾回收器回收),一次内存泄漏可能不会有很大的影响,但是长时间的内存泄露,堆积到一定程度就会产生内存溢出;
(1)单例对象,生命周期和应用程序一样,如果单例对象持有外部对象的引用,那么,这个外部对象是不能被回收的,就会产生内存泄漏;
//懒汉式单例类.在第一次调用的时候实例化自己
public class Singleton {
private Singleton() {}
private static Singleton single=null;
//静态工厂方法
public static Singleton getInstance() {
if (single == null) {
synchronized(Singleton.class){
if(single == null){
single = new Singleton();
}
}
}
return single;
}
}
单例模式中的单例对象使用static修饰,会一直占用内存;
(2)一些资源没有关闭就会导致内存泄漏,比如数据库连接,网络连接socket和IO流的连接必须在finally中close,否则就不能被回收;
-Xms -Xmx 堆大小设置
-Xss :设置栈大小
-XX:MetaspaceSize 元空间大小
-XX:MaxMetaspaceSize 元空间大小
4.2 JVM溢出之后其他线程是否可以工作
可以:
溢出之后,如果引用释放了,Eden,S、老年代的堆内存会释放;所以其他线程也可以工作;
如果堆内存溢出了,引用还是没有释放,那么堆内存就不会释放;