Java中会有内存泄漏吗

Java中会有内存泄漏吗,java,memory,memory-management,memory-leaks,Java,Memory,Memory Management,Memory Leaks,这个问题我被问了很多次。回答的好方法是什么?是的,如果不取消引用对象,它们将永远不会被垃圾收集,内存使用将增加。然而,由于java的设计方式,这很难实现,而在其他一些语言中,这有时很难实现 编辑:阅读Amokrane的链接。很好。简短的回答: 有能力的JVM没有内存 泄漏,但可以使用更多内存 因为并非所有未使用的 对象已被垃圾收集, 然而此外,Java应用程序本身可以保存对不再需要的对象的引用,这可能导致内存泄漏 是的,这是可能的 在有效的Java中,有一个示例涉及使用数组实现的堆栈。如果pop

这个问题我被问了很多次。回答的好方法是什么?是的,如果不取消引用对象,它们将永远不会被垃圾收集,内存使用将增加。然而,由于java的设计方式,这很难实现,而在其他一些语言中,这有时很难实现

编辑:阅读Amokrane的链接。很好。

简短的回答:

有能力的JVM没有内存 泄漏,但可以使用更多内存 因为并非所有未使用的 对象已被垃圾收集, 然而此外,Java应用程序本身可以保存对不再需要的对象的引用,这可能导致内存泄漏

是的,这是可能的


在有效的Java中,有一个示例涉及使用数组实现的堆栈。如果pop操作只是减少索引值,则可能会发生内存泄漏。为什么?因为数组仍然有对弹出值的引用,并且仍然有对堆栈对象的引用。因此,对于这个堆栈实现,正确的做法是在弹出数组索引处使用显式null赋值清除对弹出值的引用。

是的,因为Java应用程序可以随着时间的推移积累内存,而垃圾收集器无法释放内存


通过维护对未添加/不需要的对象的引用,它们将永远不会超出范围,并且不会收回它们的内存。

是。即使有GC,内存泄漏仍然可能发生。例如,您可能会保留一些资源,例如必须手动关闭的数据库结果集。

一个简单的答案是:只要您不使用JNI,JVM将负责POJO的[普通旧java对象]的所有初始化。有了JNI,如果您使用本机代码进行了任何内存分配,那么您必须自己处理该内存。

考虑到java使用垃圾收集器收集未使用的对象,您不能有一个悬空指针。但是,您可以将对象保留在作用域中的时间超过其需要的时间,这可能被视为内存泄漏。更多信息请点击此处:


你是在测试这个还是什么?因为这至少是一个A+。

答案是响亮的,但这通常是编程模型的结果,而不是JVM中某些缺陷的迹象。当框架的生命周期与运行中的JVM的生命周期不同时,这种情况很常见。例如:

  • *-在解决最后一个问题时,已获得数十亿美元的咨询资金

    Java中会有内存泄漏吗

    答案是,这取决于您所谈论的内存泄漏类型

    经典C/C++内存泄漏发生在应用程序忽略了<代码>免费< /代码>或<代码>处理< /代码>对象时,它泄漏了。循环引用是这种情况下的一个子情况,应用程序很难知道何时释放

    /
    释放
    ,因此忽略了这样做。相关的问题是应用程序在对象被释放后使用该对象,或者尝试释放它两次。(您可以将后一个问题称为内存泄漏,也可以称为bug。无论哪种方式…)

    Java和其他(fully1)托管语言大多不会遇到这些问题,因为GC负责释放不再可访问的对象。(当然,悬空指针和双自由问题不存在,并且循环对于C/C++ +“智能指针”和其他引用计数方案来说是没有问题的。 但在某些情况下,Java中的GC将丢失(从程序员的角度来看)应该被垃圾收集的对象。当GC无法确定无法访问某个对象时,会发生这种情况:

    • 程序的逻辑/状态可能会导致使用某些变量的执行路径无法出现。开发人员可以将此视为显而易见的,但GC无法确定,并且在谨慎方面出错(这是必须的)
    • 程序员可能对此有错误,而GC正在避免可能导致悬空引用的内容
    (请注意,Java中内存泄漏的原因可能很简单,也可能很微妙;请参阅@jonathan.cone的答案了解一些微妙的原因。最后一个原因可能涉及外部资源,您无论如何都不应该依赖GC来处理。)

    无论哪种方式,您都可能遇到这样的情况:不需要的对象无法被垃圾收集,并且会占用内存。。。内存泄漏

    还有一个问题,Java应用程序或库可以通过需要手动管理的本机代码分配堆外对象。如果应用程序/库有缺陷或使用不正确,则可能导致本机内存泄漏。(例如:……注意,这个问题在Android的更高版本中已得到修复。)



    我指的是几件事。某些托管语言允许您编写非托管代码,从而创建经典的存储泄漏。其他一些托管语言(或者更准确地说是语言实现)使用引用计数而不是适当的垃圾收集。基于引用计数的存储管理器需要某种东西(即应用程序)来打破周期。。。否则将导致存储泄漏。

    是。内存泄漏是指应用程序未向内存管理器释放的未使用内存

    我见过很多次Java代码将项存储在数据结构上,但这些项永远不会从数据结构中删除,直到出现OutOfMemoryError(OutOfMemoryError)时才会填满内存:

    void f() {
        List<Integer> w = new ArrayList<Integer>();
        while (true) {
             w.add(new Integer(42));
        }
    }
    
    void f(){
    列表w=新的ArrayList();
    while(true){
    w、 加(新整数(42));
    }
    }
    
    虽然这个例子太明显了,但Java内存错误往往更微妙。例如,使用依赖项注入将一个巨大的对象存储在数据库上,而不在对象不再使用时释放它

    在64位虚拟机上
    class MemoryLeak {
    
        private void startLeaking() throws IOException {
            StringBuilder input = new StringBuilder();
            URLConnection conn = new URL("www.example.com/file.txt").openConnection();
    
            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8));        
    
            while (br.readLine() != null) {
                input.append(br.readLine());
            }
        }
    
        public static void main(String[] args) throws IOException {
            MemoryLeak ml = new MemoryLeak();
            ml.startLeaking();
        }
    }