Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在堆内存泄漏期间,Java线程会发生什么情况?_Java_Memory Leaks - Fatal编程技术网

在堆内存泄漏期间,Java线程会发生什么情况?

在堆内存泄漏期间,Java线程会发生什么情况?,java,memory-leaks,Java,Memory Leaks,我知道堆中的内存泄漏是由于堆栈中仍然可以访问/引用的对象导致的,因此GC无法清除它。因此,我的问题是: 这是否意味着仍然有一个Java线程在运行,它是否拥有堆栈内存 如果是,再次运行相同的Java线程会增加内存泄漏,或者它会重新使用堆中的相同对象,因为它们对所有线程都可见 如果否,那么泄漏是否同时发生在堆内存和堆栈内存中,因为堆栈必须能够访问堆中的对象才能在GC中生存 对于这些简单的问题我很抱歉,但我有一些问题需要找到一个清晰的答案。谢谢 我知道堆中的内存泄漏是由于堆栈中仍然可以访问/引用的对象

我知道堆中的内存泄漏是由于堆栈中仍然可以访问/引用的对象导致的,因此GC无法清除它。因此,我的问题是:

  • 这是否意味着仍然有一个Java线程在运行,它是否拥有堆栈内存
  • 如果是,再次运行相同的Java线程会增加内存泄漏,或者它会重新使用堆中的相同对象,因为它们对所有线程都可见
  • 如果否,那么泄漏是否同时发生在堆内存和堆栈内存中,因为堆栈必须能够访问堆中的对象才能在GC中生存
  • 对于这些简单的问题我很抱歉,但我有一些问题需要找到一个清晰的答案。谢谢

    我知道堆中的内存泄漏是由于堆栈中仍然可以访问/引用的对象导致的,因此GC无法清除它

    这只是内存泄漏的一个可能原因。另一个原因是
    静态变量中存在不需要的引用。如果你挖得够深的话,可能还有其他人。(例如,您可以在本机代码中创建Java堆内存泄漏,或者通过管理不正确的类加载器或直接内存缓冲区,或者通过运行太多线程。)

    1) 这是否意味着仍然有一个Java线程在运行,它是否拥有堆栈内存

    Java线程的堆栈在终止时被移除。因此,如果堆栈存在,这意味着其线程尚未终止。但它可能正在运行、等待锁定或在I/O操作中被阻塞

    当线程终止时,其堆栈上保留的任何剩余引用将立即变得不可访问。但是从技术上讲,当
    run()
    方法调用终止时,它们就变得不可访问了

    2) 如果是,再次运行相同的Java线程会增加内存泄漏,或者它会重新使用堆中的相同对象,因为它们对所有线程都可见

    如果特定内存泄漏是由线程引起的,那么再次运行线程1自然会泄漏更多内存。另一方面,由于线程的线程终止会释放其所有引用,如果在线程终止后重新运行线程,则不会造成泄漏

    Java不“重用”对象。每次
    new
    类型(类或数组)时,都会创建一个全新的对象。总是

    堆中的对象并非对所有线程都可见。它们仅对可从中访问的线程可见

    3) 如果否,那么泄漏是否同时发生在堆内存和堆栈内存中,因为堆栈必须能够访问堆中的对象才能在GC中生存

    正如我在开始时所说,有一些方法可以创建不依赖于堆栈的内存泄漏。对象不需要通过堆栈引用就可以访问


    1-我假设我们讨论的是创建和启动一个新的
    线程
    ,使用与前面相同或等效的
    Runnable
    。从技术上讲,
    线程
    不能运行(启动)两次