内存管理是编程的一个重要方面,java 为开发人员提供了自动垃圾收集机制来高效处理它。与 c 或 c 等语言开发人员必须手动分配和释放内存不同,java 的垃圾收集器 (gc) 负责回收未使用的内存,从而降低内存泄漏的风险。
在这篇博文中,我们将探讨垃圾回收是什么、为什么它很重要、它在 java 中如何工作以及使用它的一些最佳实践。
java中的垃圾收集是自动识别和回收应用程序不再可达或不再需要的对象所占用的内存的过程。这些对象被标记为“垃圾”,并且它们的内存被回收以供重用。
java 的垃圾收集器在堆内存上运行,所有对象都存储在堆内存上。对象有不同的生命周期,垃圾收集器确保:
java 使用分代模型来优化垃圾收集,基于以下假设:
堆分为以下区域:
年轻一代(或新一代):
老一代(或终身一代):
永久代 (permgen) [java 8 之前]:
将内存分为几代可以让 gc 通过关注以下方面来优化其性能:
后 java 8 变化(元空间):
jvm提供了多种垃圾回收算法,可以根据应用的需求进行选择。
串行垃圾收集器
并行垃圾收集器(吞吐量收集器)
g1 垃圾收集器(垃圾优先)
z 垃圾收集器 (zgc)
shenandoah 垃圾收集器(shenandoah gc)
代码示例:对象如何变成垃圾
这是一个简单的示例,演示对象如何变得无法访问并有资格进行垃圾回收:
public class garbagecollectiondemo { public static void main(string[] args) { // object 1 is created person person1 = new person("alice"); // object 2 is created person person2 = new person("bob"); // reference of person1 is reassigned person1 = person2; // object "alice" is now unreachable // both person1 and person2 point to "bob" system.out.println(person1.name); // output: bob // at this point, "alice" object is eligible for garbage collection } } class person { string name; person(string name) { this.name = name; } }
说明:
虽然您无法强制进行垃圾回收,但您可以使用以下方式向 jvm 建议:
system.gc();
当对象保持不必要的引用时发生,从而阻止垃圾收集。
示例:
import java.util.arraylist; import java.util.list; public class memoryleakexample { static list<object> list = new arraylist<>(); public static void main(string[] args) { for (int i = 0; i < 10000; i++) { list.add(new object()); // keeps adding objects to the static list } } }
这里,列表保留了对所有对象的引用,使它们不符合gc。
堆已满且无法回收内存时发生。
解决方案:
使用 jvm 选项增加堆大小:
java -xmx1024m myapp
myObject = null;
通过有效地理解和利用 java 的垃圾收集,您可以确保您的应用程序高效运行,并且不会出现内存泄漏和性能瓶颈。