关于Java内存释放 如题,如果在 一个方法里,new了几个对象,在该方法里,这些对象没有被方法外的引用所指向

那么java 在执行完这个方法后, 这些对象是否就全部失去引用, 可待GC回收了?
ps : 这些对象都只在方法内被引用和使用.没有方法外的引用指向它们

1 首先, java的GC设计的目的是让开发者不关心什么时候回收,什么时候释放内存,这样开发者就可以专心做自己该做的事情。所以,开发者不应该在真正的代码中依赖垃圾回收行为。
2 仅在原理角度, 回答你的问题。
A a = new A(); 说明发生了两件事
1 A对象的一个实例在heap中被创建,占用了内存。
2 一个局部引用a被压栈,指向了1中的实例

在aaa()方法退出后, 引用a被弹出栈,这样1中的实例就没有指向它的引用, 成为了被GC回收的潜在目标。(只是从你给的例子的表面推断)
至于什么时候回收,是JVM的行为,不同版本和实现都可能存在差异。
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-11-25
您好,提问者:
在执行的时候,你这些对象虽然没有添加东西,但是还是会创建一个引用地址。
1、让对象是用完后指向null。
2、最后写入System.gc();//通知JVM执行垃圾回收,但是至于什么时候执行,这不是程序员所能控制的。
如果在方法内的话,就是在这个方法内生效的,但是如果是static那就成了全局的了。追问

public void aaa(){
A a = new A();
//以下为使用A的代码, 省略
...
}

我想知道, 此方法过后. new A() 这个对象, 是否就会失去引用?
还是说. A a 这个引用, 在此方法执行完后,不会消失, 还对 new A()有指向?
还是说, A a 这个引用,在此方法执行完后, 暂不会消失, 要待GC执行,把 A a回收了. new A()才真正的失去引用指向?. 才能被GC回收?

追答

会丢失,但是什么时候执行GC回收,我们是不知道的。
你new完后,不可能GC直接回收的。

本回答被提问者采纳
第2个回答  2013-04-17
1、方法体内的变量是有生命周期的,在{处就死了,不管有没有被引用都会在堆中分配内存空间也会有一个栈中的空指引如一楼
2、GC有两种回收机制,其中有一种叫做标记回收,就是对死亡的对象进行标注,当堆(有三级储存结构)中的eden区满时就会大范围gc()回收内存,被标记的内存空间会被优先选用
你参考一下
相似回答