Java——内存泄漏与溢出

1.浅析

内存泄露( memory leak):是指程序在申请内存后,无法释放已申请的内存空间,多次内存泄露堆积后果很严重,内存迟早会被占光。内存泄漏最终会造成内存溢出。
内存溢出(out of memory) :是指程序在申请内存时,没有足够的内存空间供其使用

JVM中有一下几种内存空间:

  • 栈内存(Stack):每个线程私有的。
  • 堆内存(Heap):所有线程公用的。
  • 方法区(Method Area):有点像以前常说的“进程代码段”,这里面存放了每个加载类的反射信息、类函数的代码、编译时常量等信息。
  • 原生方法栈(Native Method Stack):主要用于JNI中的原生代码,平时很少涉及。

Java的内存回收机制:
Java堆是一个运行时数据区,类的实例(对象)从中分配空间,JVM堆中储存着正在运行的应用程序所建立的所有对象,“垃圾回收”主要也是和堆有关。

不论哪种语言的内存分配方式,都需要返回所分配内存的真实地址,也就是返回一个指针到内存块的首地址,Java中对象是采用new或者反射的方法创建的,这些对象的创建都是在堆(Heap)中分配的。

2. Java内存泄露

内存泄露是指当前未被引用的对象持续占用内存导致内存空间的浪费。常见的内存泄漏有以下几大类:

(1)静态集合类引起
比如说静态HashMap、Vector等,这些静态变量的生命周期和应用程序一致,他们所引用的所有的对象Object也不能被释放。

Static Vector v = new Vector(10);
for (int i = 1; i<100; i++)
{
   
Object o = new Object();
v.add(o);
o = null;
}//

如上所示,循环申请Object 对象,并将所申请的对象放入一个Vector 中,如果仅仅释放引用本身(o=null),那么Vector 仍然引用该对象,所以这个对象对GC 来说是不可回收的。
必须要将Vector对象设置为null,才能回收这部分占用的内存

(2)当集合里面的对象属性被修改后,再调用remove()方法时不起作用。
主要原因是:set类存储对象是通过hashcode存储,如对象属性被修改,remove方法就不能通过原先的hashcode删除对象。

public static void main(String
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yawn__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值