在堆内存泄漏期间,Java线程会发生什么情况?
我知道堆中的内存泄漏是由于堆栈中仍然可以访问/引用的对象导致的,因此GC无法清除它。因此,我的问题是:在堆内存泄漏期间,Java线程会发生什么情况?,java,memory-leaks,Java,Memory Leaks,我知道堆中的内存泄漏是由于堆栈中仍然可以访问/引用的对象导致的,因此GC无法清除它。因此,我的问题是: 这是否意味着仍然有一个Java线程在运行,它是否拥有堆栈内存 如果是,再次运行相同的Java线程会增加内存泄漏,或者它会重新使用堆中的相同对象,因为它们对所有线程都可见 如果否,那么泄漏是否同时发生在堆内存和堆栈内存中,因为堆栈必须能够访问堆中的对象才能在GC中生存 对于这些简单的问题我很抱歉,但我有一些问题需要找到一个清晰的答案。谢谢 我知道堆中的内存泄漏是由于堆栈中仍然可以访问/引用的对象
静态变量中存在不需要的引用。如果你挖得够深的话,可能还有其他人。(例如,您可以在本机代码中创建Java堆内存泄漏,或者通过管理不正确的类加载器或直接内存缓冲区,或者通过运行太多线程。)
1) 这是否意味着仍然有一个Java线程在运行,它是否拥有堆栈内存
Java线程的堆栈在终止时被移除。因此,如果堆栈存在,这意味着其线程尚未终止。但它可能正在运行、等待锁定或在I/O操作中被阻塞
当线程终止时,其堆栈上保留的任何剩余引用将立即变得不可访问。但是从技术上讲,当run()
方法调用终止时,它们就变得不可访问了
2) 如果是,再次运行相同的Java线程会增加内存泄漏,或者它会重新使用堆中的相同对象,因为它们对所有线程都可见
如果特定内存泄漏是由线程引起的,那么再次运行线程1自然会泄漏更多内存。另一方面,由于线程的线程终止会释放其所有引用,如果在线程终止后重新运行线程,则不会造成泄漏
Java不“重用”对象。每次new
类型(类或数组)时,都会创建一个全新的对象。总是
堆中的对象并非对所有线程都可见。它们仅对可从中访问的线程可见
3) 如果否,那么泄漏是否同时发生在堆内存和堆栈内存中,因为堆栈必须能够访问堆中的对象才能在GC中生存
正如我在开始时所说,有一些方法可以创建不依赖于堆栈的内存泄漏。对象不需要通过堆栈引用就可以访问
1-我假设我们讨论的是创建和启动一个新的线程
,使用与前面相同或等效的Runnable
。从技术上讲,线程
不能运行(启动)两次