原始
Java内存溢出(内存泄漏)
对内存不足的普遍理解是内存不足。在计算机程序中的普遍理解是,无法释放已打开的内存空间。尽管Java提供了垃圾回收机制,但它不能保证我们编写的代码不会溢出。
import java.util.ArrayList;
import java.util.List;
public class MyList{
/*
* 此处只为掩饰效果,并没有进行封装之类的操作
* 将List集合用关键字 static 声明,这时这个集合将不属于任何 MyList 对象,而是一个类成员变量
*
*/
public static List list = new ArrayList();
}
class Demmo{
public static void main(String[] args) {
MyList list = new MyList();
list.list.add("123456");
// 此时即便我们将 list指向null,仍然存在内存泄漏,因为MyList中的list是静态的,它属于类所有而不属于任何特定的实例
list = null;
}
}
在上述情况下,如果要防止内存溢出,我们应该做的是在每次删除集合中无用的元素之后调用List集合中的remove方法。

此外,由于它是一个静态变量,因此请勿使用类对象来调用它。使用实例对象调用静态变量可能会导致一些意想不到的后果!
存在三种内存溢出情况。
1、 OutOfMemoryError:PermGen空间
永久生成空间此区域主要用于保存添加的Class的某些信息。它在程序运行期间被永久占用。 Java的GC将不会发布它。因此,如果启动程序加载的信息较大,则超过此空间的大小将发生溢出错误;

解决方案仅是增加空间分配-增加Java虚拟机中XX:PermSize和XX:MaxPermSize参数的大小,其中XX:PermSize是初始永久存储区的大小,而XX :MaxPermSize是最大永久存储区域大小。
2、 OutOfMemoryError:Java堆空间
heap是Java内存中的堆区域,主要用于存储对象。如果有太多对象超出空间大小,并且GC太晚而无法释放,则会发生溢出错误。
使用Java创建对象是可控制的,但是GC会自动回收对象。一般而言,当没有对现有对象的引用(即不可达)时,GC会定期回收这些对象。释放空间。但是,由于程序的设计,对象是可访问的,但没有用(即上述内存泄漏)。当这种情况越来越多时,问题就会出现。
针对此问题,我们需要做两件事:
1、检查程序,以减少重复创建对象的无休止循环并减少内存泄漏。
2、增加Java虚拟机中Xms(初始堆大小)和Xmx(最大堆大小)参数的大小。
3、 StackOverFlowError
Stack是Java内存中的堆栈空间。它主要用于存储临时数据,例如方法中的变量和参数。通常由于分配的空间太小或方法在太多的递归层中执行而发生溢出。堆栈帧过多,导致溢出。
针对此问题,除了修改配置参数-Xss参数以增加线程堆栈大小之外,程序的优化尤其重要。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-362125-1.html
1后一天蓝屏接近10次气死老子了