垃圾回收简介
内存管理
内存管理是软件开发中的一个核心方面。应用程序会定期创建新对象,而对象会定期超出范围,不再能够被引用。让我们通过一个代码片段来看看这意味着什么
class HelloWorld{
String message;
printHelloMessage(String name){
message = "Hello " + name;//New String instance "message" created
print(message);
} //reference to message is lost once scope leaves method
}
在上面的示例中,message
在 printHelloMessage()
的开头被分配了一个引用值,一个“hello”消息。一旦范围离开 printHelloMessage()
,分配给 message
的引用值将不再可达,但仍然存在于内存中。每次执行 printHelloMessage()
时,都会将一个新的引用值分配给 message
并分配内存。如果不存在从内存中删除这些引用的过程,最终应用程序可能会耗尽内存,因为死引用会消耗所有可用内存。
在 C 和 C++ 等语言中,删除引用将由手动处理(例如,通过调用 free
或 delete
)。这会从内存中删除引用,允许系统回收内存以供重用。
手动内存管理确实有一些优点。开发人员可以精确控制何时删除对象。手动内存管理也可能更有效,因为没有后台进程运行,消耗系统资源并监控内存使用情况。虽然随着现代自动化内存系统的性能提升,这种优势变得不那么重要了。
但是,手动内存管理也有一些明显的缺点。使用手动内存管理,开发人员必须有意识地了解应用程序如何使用内存。这可能很耗时且困难,需要开发人员为从内存中安全分配和释放对象添加控制代码。这种控制代码可能会分散注意力,因为它会掩盖代码试图完成的业务意义上的工作。开发人员也可能无法正确处理错误条件,导致对象未被删除,从而导致内存泄漏。
手动内存管理所涉及的大量工作以及计算机的快速发展导致了向自动化内存管理的转变。如今,大多数现代编程语言,包括 Java,都使用垃圾收集器自动处理内存管理。
Java 中的内存管理
在 Java 中,内存管理由垃圾收集器处理,垃圾收集器是 Java 虚拟机 (JVM) 的一部分。在 JVM 中,垃圾收集器是一个后台进程,它监控内存中的对象。垃圾收集器会定期运行垃圾回收,检查内存中的对象是否仍然可达,删除不可达的对象,并重新组织仍然存活的对象,以更有效地使用内存并改进未来的垃圾回收。
垃圾收集器大大减少了开发人员必须花费在内存管理上的时间和精力。开发人员通常不需要有意识地考虑内存管理。垃圾回收还有助于大大减少(但不能消除)内存泄漏等问题。
在下一节中,我们将更深入地了解垃圾收集器在 Java 中的行为。
上次更新: 2022 年 3 月 6 日