java内存溢出场景

栈溢出   :其实就是虚拟机栈内存满了,虚拟机栈就是存方法的,一个虚拟机栈帧中有 操作数 参数列表 动态链接 返回值

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不显性地关闭,将会造成大量的对象无法被回收,从而引起内存泄漏。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值