Java中的内存分配/释放

时间:2014-03-02 00:15:42

标签: java

我是java的初学者。假设我声明了一个Account

类型的变量
Account _account = new Account("Thomas");

然后在其他地方我会做这样的事情:

_account = new Account("George");

在第一个语句中为变量_account分配的内存槽会发生什么?它会自动重新分配吗?这项操作是否会以记忆为代价获得任何成本?谢谢。

2 个答案:

答案 0 :(得分:5)

如果没有对旧对象的引用,则会自动对其进行垃圾回收。 (或者,更准确地说,它可用于垃圾收集,当垃圾收集器到达它时,内存将自动回收。)

如果您没有将原始_account引用分配给任何内容并且只是覆盖它,则上述情况属实。但是,如果你这样做:

Account _account = new Account("Thomas");
List<Account> accounts = new ArrayList<>();
accounts.add(_account);

_account = new Account("George");

然后旧对象仍然通过accounts列表(间接)引用。只要可以从代码中的任何实时变量以某种方式到达原始对象,那么它就不会被垃圾收集。

答案 1 :(得分:1)

您调用的“内存插槽”将有资格进行垃圾回收。这意味着您无法再访问它,它迟早会从内存中删除。

使用new分配新对象的操作具有隐含成本(除了在构造函数中完成的可能计算)。清理未使用的引用也有隐含的成本,因为它为垃圾收集器创建了工作。但这是面向对象编程的本质。除非您的整个工作不仅包括分配新对象,否则这不应成为问题。如果 是一个问题,那么您的程序很可能出现其他问题。