Java中内存泄漏的情况

本文深入探讨了Java中的内存泄漏问题,解释了什么是内存泄漏及Java的垃圾回收机制如何工作,特别是针对引用循环的处理方式。此外,还列举了几种常见的内存泄漏场景,包括长生命周期对象持有短生命周期对象的引用、内部类对外部类的引用以及HashSet中对象的哈希值变化导致的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,所谓的内存泄漏就是指一个不再被程序使用的对象或者变量一直被占据在内存中。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集合中单独删除当前对象,造成内存泄露。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值