这与Java中的内存泄漏有关。我想知道,java中的内存泄漏到底是什么?导致内存泄漏的不同因素或代码错误是什么?如何识别给定代码中的内存泄漏?
这些大多是面试时常问的问题,我想详细了解这些问题。有人能解释一下并帮助我吗。
发布于 2021-07-05 09:04:27
然而,这个问题太粗糙了,无法在这里得到完全正确的答案。我只向你展示了常见的行为模式。
什么是内存泄漏?
内存泄漏是这样一种情况,即堆中存在的对象不再被使用,但是垃圾收集器无法从内存中删除它们,因此它们被不必要地维护。内存泄漏是不好的,因为它阻塞内存资源,并随着时间的推移降低系统性能。
?中导致内存泄漏的原因
第一个可能导致Java内存泄漏的场景是使用静态字段引用一个重对象。我们将ArrayList创建为一个静态字段--在JVM进程的生存期内,JVM垃圾收集器将永远不会收集该字段,即使在对其进行计算之后也是如此。
内存泄漏的症状:
一开始工作得很快,但随着时间的推移而变慢。
JVM
常见内存泄漏:
文件/文本缓冲区未关闭。
如果等于()和hashcode(),则不会实现保持引用活动的哈希映射。
import java.util.Map;
public class MemLeak {
public final String key;
public MemLeak(String key) {
this.key = key;
}
public static void main(String args[]) {
try {
Map map = System.getProperties();
for(;;) { map.put(new MemLeak("key"), "value"); }
}
catch(Exception e) { e.printStackTrace(); }
}
}如何修复它们?
有两种方法。第一个是“快速修复”尝试。如果失败了,你就得走很长的路。
JVM快速修复: Eclipse内存泄漏警告(捕获一些leaks)
)观察的内存使用情况。
发布于 2021-07-05 09:02:10
Java中的内存泄漏通常不会发生。
这并不是经典意义上的:在其他编程语言中,您通常需要手动释放内存。这在Java中不会发生,因为垃圾收集器通常会为您删除未使用的数据。
但是,在Java中,您仍然可以耗尽内存。Java中最接近“内存泄漏”的地方是,您保留了对不再需要的对象的引用,并且对象越来越多。
因此,也许您有一个包含大量对象的列表,并且忘记将它们从列表中删除,即使您不再需要它们。这样,垃圾收集器就不能删除不必要的objetcs,因为它们仍然是需要的。
也可以查看谷歌的WeakReference
https://stackoverflow.com/questions/68253294
复制相似问题