局部变量-关于java内存垃圾回收的一点疑问

问题描述

关于java内存垃圾回收的一点疑问

class test{

void m(){
Object obj[]=new Object[1];
 Object o = new Object();
 obj[0]=o;
o = null;//用不着
}
}
很常见的一个例子,说最后Object对象都没有被释放,因为obj[0]还引用这个对象。
我的疑问是,既然局部变量在方法运行完,引用会被销毁,也就是说o不用被置为null,也会堆内存的Object对象也会被回收(符合回收的条件,不一定立即GC),那同理,obj这个局部变量应该也会被销毁,它指向的堆里的Object也会被回收(符合回收的条件,不一定立即GC),这样就不会再引用到Object对象了,按理说最后Object对象应该符合被GC的条件的啊?

我知道GC可能不是立即执行!我想知道的是,是否符合被GC的条件!

望高人解答,我实在没金币了,见谅

解决方案

Java内存与垃圾回收调优
Java内存与垃圾回收调优
Java内存与垃圾回收调优

解决方案二:

GC时会对活动对象进行标记,没有被标记的对象就是垃圾对象,但垃圾对象不会直接被清除,垃圾收集器还会判断是否需要执行对象的finalize方法,如果对象没有覆写finalize方法或它的finalize已经被执行过一次,那么是没有必要执行的,否则就认为是有必要执行的,当被判断为有必要执行时,这个对象会被放入一个F-Queue队列中,由一个后台的低优先级的Finalizer线程执行队列中的对象的finalize方法,对象可以在这个方法中中复活自己,即重新被其他对象引用,但这个函数只会被垃圾收集器运行一下,第二次回收这个对象时这个函数不会再被调用。稍后GC会对F-Queue队列中的对象执行第二次标记。要了解更详细的话可以参考这篇文章:JAVA中的垃圾回收机制

解决方案三:

jvm的不同版本采取的垃圾收集方式不同,判断是不是应该标记为垃圾的方式也不同,还有即使是垃圾也不一定会清除。具体的可以看看深入理解jvm

解决方案四:

谢谢各位好心人,可能我没表达清楚,我换个问法:
方法执行完毕后,是否还有引用指向Object对象,从而是Object对象符合条件被GC,当然,可能不是立即就被GC。
我的理解,v也是局部变量,方法执行完后,也会被销毁,这样到最后,是没有引用指向Object对象的

时间: 2024-11-08 22:04:39

局部变量-关于java内存垃圾回收的一点疑问的相关文章

简单理解Java的垃圾回收机制与finalize方法的作用_java

垃圾回收器要回收对象的时候,首先要调用这个类的finalize方法(你可以 写程序验证这个结论),一般的纯Java编写的Class不需要重新覆盖这个方法,因为Object已经实现了一个默认的,除非我们要实现特殊的功能(这 里面涉及到很多东西,比如对象空间树等内容). 不过用Java以外的代码编写的Class(比如JNI,C++的new方法分配的内存),垃圾回收器并不能对这些部分进行正确的回收,这时就需要我们覆盖默认的方法来实现对这部分内存的正确释放和回收(比如C++需要delete). 总之,f

Java的垃圾回收机制研究

一.谁在做Garbage Collection? 一种流行的说法:在C++里,是系统在做垃圾回收;而在Java里,是Java自身在做. 在C++里,释放内存是手动处理的,要用delete运算符来释放分配的内存.这是流行的说法.确切地说,是应用认为不需要某实体时,就需用delete告诉系统,可以回收这块空间了.这个要求,对编码者来说,是件很麻烦.很难做到的事.随便上哪个BBS,在C/C++版块里总是有一大堆关于内存泄漏的话题. Java采用一种不同的,很方便的方法:Garbage Collecti

深入理解Java之垃圾回收

概述 由于JVM中垃圾收集器的存在,使得Java程序员在开发过程中可以不用关心对象创建时的内存分配以及释放过程,当内存不足时,JVM会自动开启垃圾收集线程,进行垃圾对象的回收. 那么垃圾回收线程到底是什么时候触发,并如何实现垃圾回收的呢?本文将对openjdk的源码进行分析,并通过代码分析Java垃圾回收的过程. VMThread VMThread主要负责调度执行虚拟机内部的VM线程操作,如GC操作等,在JVM实例创建时进行初始化. VMThread::create() VMThread::cr

java中有垃圾回收GC, 为什么还要调用close

问题描述 比如说流操作结束后,为什么一定要close掉.java有垃圾回收器,这样做不就是多此一举吗.? 解决方案 解决方案二:自己顶一下解决方案三:因为java的垃圾回收,用户是没有办法控制的,它会在不确定的时候触发,而且java不保证在整个程序运行期一定会触发垃圾回收,所以对于流.socket等之类的资源用完之后一定要关闭.而且垃圾回收机制对于socket.thread之类的对象即使引用计数为0了,只要还是在活动的情况下,也不会被回收.解决方案四:垃圾回收机制对于socket.thread之

Java 的垃圾回收机制(转)

先看一段转载,原文出自 http://jefferent.iteye.com/blog/1123677 虚拟机中的共划分为三个代:年轻代(Young Generation).年老点(Old Generation)和持久代(Permanent Generation).其中持久代主要存放的是Java类的类信息,与垃圾收集要收集的Java对象关系不大.年轻代和年老代的划分是对垃圾收集影响比较大的. 年轻代: 所有新生成的对象首先都是放在年轻代的.年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象.

析JAVA之垃圾回收机制

本文为2010年编写,所以有很多看法不是很准确,有一定的参考价值,如需要更加深入细节,请参看,2012年编写的关于JVM的文章: 认识JVM--第一篇-对象生成&回收算法 认识JVM--第二篇-java对象内存模型 JVM第三篇(简单demo) 系统架构-性能篇章1(应用系统性能2-OOM&参数配置) 相继的还会有更多的java深入的知识和机制. 对于JAVA编程和很多类似C.C++语言有一个巨大区别就是内存不需要自己去free或者delete,而是由JVM垃圾回收机制去完成的.对于这个过

Java的垃圾回收

1. 垃圾回收的意义 在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确释放之前不能分 配给其它对象:而在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾.JVM的 一个系统级线程会自动释放该内存块.垃圾回收意味着程序不再需要的对象是"无用信息",这些信 息将被丢弃.当一个对象不再被引用的时候,内存回收它占领的空间,以便空间被后来的新对象使用.事实上 ,除了释放没用的对象,垃圾回收也可以清除内存记录碎片.由于创建对象和垃圾回收器释放丢弃对象所占的

各位大神有空的来探讨下java的垃圾回收机制吧

问题描述 1.java的对象不一定会被gc回收.问下不用new关键字创造的特殊对象有哪几种?Strings="ss";算吗?字符串池不在gc的回收范围吗?2.finalized()并不是c++的析构方法?为什么调用System.gc()不一定要调用finalized()?在这里对象的终结条件怎么理解?怎么自己重写finalized()?将将回收的对象的引用置为null?将流引用的文件关闭?3.为啥说java的gc不能完全代替c的析构?能探讨下gc的两种工作"暂停-复制&quo

浅析Java内存模型与垃圾回收_java

1.Java内存模型 Java虚拟机在执行程序时把它管理的内存分为若干数据区域,这些数据区域分布情况如下图所示: 程序计数器:一块较小内存区域,指向当前所执行的字节码.如果线程正在执行一个Java方法,这个计数器记录正在执行的虚拟机字节码指令的地址,如果执行的是Native方法,这个计算器值为空. Java虚拟机栈:线程私有的,其生命周期和线程一致,每个方法执行时都会创建一个栈帧用于存储局部变量表.操作数栈.动态链接.方法出口等信息. 本地方法栈:与虚拟机栈功能类似,只不过虚拟机栈为虚拟机执行J