1: Java 中也存在栈内存泄露的情况?
在 Java 中,栈内存主要用于存储方法调用和本地变量。与堆内存不同,栈内存的分配和释放是由编译器和虚拟机自动处理的,通常不需要手动释放。
然而,如果在编写代码时出现一些问题,可能会导致栈内存泄露。以下是一些可能引起栈内存泄露的常见情况:
a 递归调用问题:如果递归调用没有正确地终止,或者递归深度过大,会导致栈内存不断增长,最终可能导致栈溢出错误。
c 线程泄露:如果在应用程序中创建了大量的线程,并且这些线程没有正确地终止或释放资源,就可能导致栈内存泄露。
导致内存泄露的的情况:
1) 静态集合类:
HashMap, LinkedList等,这些容器本身是静态的,它们的生命周期和程序一致,但是持有的对象不会被释放。
2)单例模式:
单例模式旨在确保在整个应用程序中只有一个实例存在,这可以通过在类中使用静态变量来实现。
Singleton作用域适用于那些无状态、线程安全且共享的Bean。使用Singleton作用域可以节省内存,并提高应用程序的性能,因为只需创建一个实例,多个组件可以共享该实例。
3)未关闭的资源:数据库连接,网络连接,IO连接等。
4) 变量不合理的作用域: 一个变量的作用域范围大于使用范围,会导致内存泄露。 这个时候要及时的设置成null
5) 非静态内部类持有外部类的引用:
6) 改变哈希值: 当对象被存储到HashSet集合中,就不能修改对象中参与计算哈希值的字段了。
7)缓存泄露: 把对象放入到缓存(hashMap)中,可能会导致泄露,解决方法是使用WeakhashMap(除了自身的引用外,没有其他的引用会自动丢弃)
8) 监听器和回调:
补充知识点:
主内存: 所有线程创建的实例对象都放在主内存中(包括成员变量和局部变量)
本地内存: 每个线程都有一个私有的本地内存来存储主内存中的共享变量的副本。
标签:java,变量,作用域,面试,实例,线程,内存,泄露 From: https://www.cnblogs.com/liufei1983/p/17436790.html