在 Java 中,原语和对象引用存储在堆栈中,而对象存储在堆中。假设有一个user类的对象User,它有字段int age和String name。栈顶是对 的引用user,对象本身user存储在堆上。它的字段age和链接将存储在name哪里?
也在堆栈上,在对自身的引用之上user?从某种意义上说,当创建它的函数结束时,user堆栈指针应该向下移动,并且所有这些变量——对 的引用user、原语int age和对的引用都name应该从内存中消失。
这不是真的。引用和原语也可以存储在堆上,对象可以存储在栈上。
了解变量和字段之间的区别很重要。
age- 这个领域。它有一个原始类型,但它将存储在与对象相同的位置 - 堆上。引用类型的字段也是如此name。someVar和user是变量并存储在堆栈中。第一个存储值 2,第二个包含对 class 对象的引用User。当方法终止时,
someMethod栈帧将被销毁,and 变量将不再someVar存在user。但对象本身user将保留在堆上,直到下一次调用垃圾收集器。垃圾收集器在启动时将检查所有现有的堆栈帧,在其中找不到对对象的引用,user然后才将其删除。@Sergey Gornostaev对象可以存储在堆栈中
请不要误导人。堆栈存储对对象的引用,而不是对象本身。本文讨论了与在堆上创建对象相关的优化。也就是说,如果该对象除了创建它的方法之外没有在其他任何地方使用,则不需要创建它。这降低了运行 GC 的成本。