栈溢出 :其实就是虚拟机栈内存满了,虚拟机栈就是存方法的,一个虚拟机栈帧中有 操作数 参数列表 动态链接 返回值
stackoverflow情况
1、方法递归没有出口,或者方法回调太长,也就是栈帧太多了,虚拟机栈存满了。
2、定义的数组太大了,在栈中存不下
3、指针或数组越界。这种情况最常见,例如进行字符串拷贝,或处理用户输入等等。
OutOfMemoryError
堆溢出
看下面
******************************************************************************************************************
这就是一篇笔记。
什么是内存泄漏,就是我们程序运行中某个已经不用了的对象,无法被我们的垃圾回收器回收掉,一直存在那里占内存。
静态集合类
我们在使用集合类的时候,将它设为静态的 比如 static ArrayList list; //因为类的静态属性是存在方法区中。
接下来分析一下,当我们使用这个集合类的使用,我们这样 list.add(); 然后我们要是将那个对象设置为null ,这个时候那一块内存是不能被回收的。
长此以往,这个集合类就会出现很大一块内存没有数据,但是不能被回收。造成内存泄漏。
集合里的对象属性值被改变
public static void main(String[] args)
{
Set<Student> set = new HashSet<Student>();
Student s1 = new Student("Jack");
Student s2 = new Student("Mary");
Student s3 = new Student("Eason");
set.add(s1);
set.add(s2);
set.add(s3);
System.out.println(set.size());//3
s2.setName("Jackson"); //修改属性,此时s2元素对应的hashcode值发生改变
set.remove(s2); // remove不掉,造成内存泄漏
set.add(s2); // 添加成功
System.out.println(set.size());//4
}
set集合使用对象student作为元素,所以当我们去修改student里面的数据的时候,就会造成一些找不到原来的那个元素了。并且我们也没有办法删除掉那个数据。造成内存泄漏。这个好好想想。
解决办法,重写这个集合的equals和 hashcode方法, 这样我们可以保证每一个对象的唯一属性。然后每次根据这个唯一值去找到对象的那个对象。OK
监听器
为什么监听器他也会造成内存泄漏呢?
其实很简单啊,监听器是不是一直要在哪里监听,没有为null的情况吧,如果到了某个时候我们不想要他监听了,那是不是就一定要我们自己去手动给他设为null啊。没毛病的啊。
所以当我们用完之后,一定要给他设为null。就可以解决了。
内部类持有外部类
如果一个外部类的实例对象的方法返回了一个内部类的实例对象,这个内部类对象被长期引用了,即使那个外部类实例对象不再被使用,但由于内部类持有外部类的实例对象,这个外部类对象将不会被垃圾回收,这也会造成内存泄露。
各种连接
数据库连接、网络连接和IO连接等。在对数据库进行操作的过程中,首先需要建立与数据库的连接,当不再使用时,需要调用close方法来释放与数据库的连接。只有连接被关闭后,垃圾回收器才会回收对应的对象。否则,如果在访问数据库的过程中,对Connection、Statement或ResultSet不显性地关闭,将会造成大量的对象无法被回收,从而引起内存泄漏。