Java 收集、单例、垃圾收集
我有以下代码:Java 收集、单例、垃圾收集,java,garbage-collection,Java,Garbage Collection,我有以下代码: public void method1() { Emp e1 = new Emp(); Emp e2 = new Emp(): Emp e3 = new Emp(); method2(e1, e2, e3); } public void method2(Emp... emps) { List<Emp> emps = new ArrayList<>(); for(final Emp emp : emps) {
public void method1() {
Emp e1 = new Emp();
Emp e2 = new Emp():
Emp e3 = new Emp();
method2(e1, e2, e3);
}
public void method2(Emp... emps) {
List<Emp> emps = new ArrayList<>();
for(final Emp emp : emps) {
emps.add(emp);
}
// do some task with list
}
公共作废方法1(){
Emp e1=新的Emp();
Emp e2=新Emp():
Emp e3=新的Emp();
方法2(e1、e2、e3);
}
公共无效方法2(Emp…Emp){
List emps=new ArrayList();
用于(最终环境管理计划环境管理计划:环境管理计划){
emp.add(emp);
}
//用列表做一些任务
}
那么当method2返回时,EMP会被垃圾收集吗?或者我们需要显式删除元素。希望从内存泄漏的角度来理解
非常感谢任何指针。垃圾收集运行的时间不确定。只要没有对对象的引用,它就有资格进行
垃圾收集
在Java中调用一个方法时,它会进入堆栈框架。当该方法从堆栈中弹出时,其所有成员都将死亡。因此,他们有资格获得gc。方法执行后,在其内部创建的对象变得不可访问或匿名,因此有资格进行垃圾收集。简短回答:是,“EMP”将被垃圾收集,否,您不需要显式删除Java中的元素
<强>更长的回答< /强>:假设你是java和垃圾回收的新手(也许是C++背景)?那么到目前为止的答案可能是跳过你正在寻找的简单答案。正如一些人所指出的,您发布的代码不会用Java编译,因此我们无法给出一个完美的答案。这就是说,我假设您真的只是问我们是否必须在Java中显式释放内存:不,我们不需要
发件人: 在像C这样的编程语言中,分配和释放内存是一个手动过程。在Java中,释放内存的过程由垃圾收集器自动处理垃圾收集是一个复杂的主题,但您可以从本质上相信JVM将在某个时间间隔内识别“哪些对象正在使用,哪些没有使用”,并在某个时间间隔内删除“未使用的对象”。因此,如果允许JVM看到对象未被使用,那么很可能不会在程序中打开任何“内存泄漏”——换句话说,在不需要对象时不要保留它们 这不会编译。“method2什么时候返回EMP会被垃圾收集?”迂腐的回答:不太可能,因为GC可能不会运行一段时间<当
method2
返回时,code>emp将符合GC的条件,但是GC的实际行为不会发生,直到JVM选择这样做,并且您不知道什么时候可能会发生。--此外,当method2
返回时,只有emp
符合GC条件。3个Emp
对象仍然由method1
中的局部变量引用,因此在method1
返回之前,它们不符合GC的条件。您的代码示例中没有任何单例,但在标题中提到了它们。编辑标题或正文,使之相互匹配。旁注:要从varargs参数中获取List
,只需使用List empsList=Array.asList(emps)事实上,根本不能保证垃圾回收会发生。如果您的应用程序是短期的,并且分配了大量内存,则收集器可能不需要在退出之前运行。或者,您的应用程序可能运行的新版本没有实现任何实际的内存回收机制。此外,在Java 10及更高版本中,我们可能会在未来的收集器中看到更多不同的行为。标记未使用的对象不会真正发生-每个GC的工作方式正好相反:它拯救了非垃圾,留下的是空闲内存。“这一过程的第一步叫做标记。这就是垃圾回收器识别哪些内存正在使用,哪些内存没有使用的地方。”()。你对我的帖子建议什么编辑?标记的是正在使用的对象,而不是相反。这有两个原因:1.无法标记未使用的对象,因为无法访问它们(没有所有对象的中心目录;存在所谓的GC根,您可以从这些根开始并将所有可访问的对象标记为活动的).2.死亡物体的数量通常比幸存物体的数量大得多,因此不接触死亡物体对提高效率至关重要。事实上,有许多不同的地面军事系统,这使得它更加复杂。+++不知道如何更好地表述它。也许只需将“标记”替换为“未使用”。@maaartinus,我删除了对“未使用”的引用标记“,我用直接引用取代了我自己的一些措辞。