首先,所谓的内存泄漏就是指一个不再被程序使用的对象或者变量一直被占据在内存中。java中有垃圾回收机制,他可以保证一对象不再被引用的时候,机对象编程的孤儿的时候,对象将自动被垃圾回收器从内存中清楚掉。由于...
首先,所谓的内存泄漏就是指一个不再被程序使用的对象或者变量一直被占据在内存中。java中有垃圾回收机制,他可以保证一对象不再被引用的时候,机对象编程的孤儿的时候,对象将自动被垃圾回收器从内存中清楚掉。由于java使用有向图的方式进行垃圾回收管理,可以消除引用循环的问题,例如有两个对象,相互引用,只要他们的根进程不可达,那么GC也是可以回收他们的
import java.io.IOException; public class GarbageTest {	public static void main(String[] args) {	// TODO Auto-generated method stub try {	gcTest();	} catch (IOException e) {	// TODO Auto-generated catch block	e.printStackTrace();	}	}	public static void gcTest() throws IOException {	System.in.read();	Person p1=new Person();	System.in.read();	Person p2=new Person(); p1.setMate(p2);p2.setMate(p1);	System.in.read();	System.in.read();	System.gc();	}	private static class Person{	byte[] data=new byte[2000000];	Person mate=null;	public void setMate(Person other) {	mate=other;	}	} }
java中内存泄露的情况:长生命周期的对象持有短生命周期对象的引用就很有可能发生内存泄漏。
1.如果一个外部类的实例对象的方法返回了一个内部内的实例对象,这个内部类对象被长期引用了,即使那个外部类实例对象不再被使用,由于内部类持久外部类的实例对象,这个外部类对象将不会被垃圾回收,这也会造成内存泄露。
2.堆栈内存溢出:主要的特点就是清空堆栈中的某个元素,并不是彻底把它从数组中拿掉,而是把存储的总数减少。
3.当一个对象被存储进HashSet集合中以后,就不能修改这个对象中的那些参与计算哈希值的字段了,否则,对象修改后的哈希值就不同了,在这种情况下,即使使用contains方法使用该对象的当前引用作为的参数去HashSet集合中检索对象,也将返回找不到对象的结果,这也会导致无法从HashSet集合中单独删除当前对象,造成内存泄露。
Java中对象是采用new或者反射的方法创建的,这些对象的创建都是在堆(Heap)中分配的,所有对象的回收都是由Java虚拟机通过垃圾回收机制完成的。GC为了能够正确释放对象,会监控每个对象的运行状况,对他们的申请、...
Java内存回收机制
不论哪种语言的内存分配方式,都需要返回所分配内存的真实地址,也就是返回一个指针到内存块的首地址。Java中对象是采用new或者反射的方法创建的,这些对象的创建都是在堆(Heap)中分配的,所有对象的回收都是由Java虚拟机通过垃圾回收机制完成的。GC为了能够正确释放对象,会监控每个对象的运行状况,对他们的申请、引用、被引用、赋值等状况进行监控,Java会使用有向图的方法进行管理内存,实时监控对象是否可以达到,如果不可到达,则就将其回收,这样也可以消除引用循环的问题。在Java语言中,判断一个内存空间是否符合垃圾收集标准有两个:一个是给对象赋予了空值null,以下再没有调用过,另一个是给对象赋予了新值,这样重新分配了内存空间。
Java内存泄漏引起的原因
内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费称为内存泄漏。内存泄露有时不严重且不易察觉,这样开发者就不知道存在内存泄露,但有时也会很严重,会提示你Out of memory。
Java内存泄漏的根本原因是什么呢?长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄漏,尽管短生命周期对象已经不再需要,但是因为长生命周期持有它的引用而导致不能被回收,这就是Java中内存泄漏的发生场景。具体主要有如下几大类:
1、静态集合类引起内存泄漏:
像HashMap、Vector等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,他们所引用的所有的对象Object也不能被释放,因为他们也将一直被Vector等引用着。例如
Static Vector v = new Vector(10);
for (int i = 1; i