static变量 class A{private static String str = "23113";}这个A类里的str变量,从第一次用它,就在内存里!我程序里也没用 str = null;这个变量什么时候会被GC回收,还是不会被GC回收 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我程序上周五开始跑的,一个static变量只在一开始引用了它,以后都没用,它也没被回收啊 我就按我个人理解的解释红色 部分。第一:要明白Java虚拟机的工作原理。Java虚拟机要用到的类才会去加载的。第二:要明白静态(static)的作用。当Java虚拟机加载该类的时候,就会将该类静态字符串加载到内存中,提供给它自己或者是它的所有对象共享,其他的类或者是其他类的对象都不能共享该字符串。如果该类没有被Java虚拟机用到了,就要被回收了,当然属于该类的静态字符串也同样被回收的。 这我知道你只想是想问:我没有引用类A,只是它被加载了,根本没对象(我根本没创建它,更没有子类), 我只引用了它的变量str,我程序里也没显示把str=null;那它什么时候会回收 “不再被引用了就会被立即回收”,不是这样的。每个JVM都有自己的GC算法,什么时候回收由JVM来决定,即使你在程序中显示地调用gc方法,也并不一定就会立即回收。 你如果没有引用那JVM怎么会加载呢? : 看后面:只是它被加载了,根本没对象我没说没加载,只是说没这对象 有点同意joejoe的观点我一重启tomcat ,变量又重新赋值了但这还不能证明joejoe 的观点 http://blog.csdn.net/dingxy/archive/2008/05/23/2472207.aspx 对于static变量,他是在你没有创建对象之前就已经存在的。 这个问题值得探讨,static的变量不用的时候被GC回收,现在的问题是什么时候不用???? 简单的说,static类型的成员,它只属于类本身,当JVM需要加载这个类时,它才会被创建.同样,当JVM不再需要这个类时,这个类会被回收,它的static成员也会被回收. 我赞成 !!static 变量存储于 dataSegment 属于类变量。加载就类时就创建,类消失,static成员当然也会随着类一起消失!!至于什么时候消失,取决于JVM中的垃圾回收机制!!也就是我们所说的GC JVM并不能保证回收,你如果想回收应当自己写方法。 我是个菜鸟,但是我也有自己的观点。我比较同意amossavez 的说法,但是他没有说清楚.请看我的解释.首先要知道java的成员变量分为:实例变量和类变量(也就是static变量).当JAVA程序执行时,类的字节码文件就被加载到内存,如果该类没有创建对象,类的实例成员变量不会被分配内存,但是类中的类变量在类被加载到内存的时候,就分配了相应的内存空间.如果该类创建对象,那么不同的实例变量互不相同,即分配不同的内存空间,而类变量不再重新分配,所有的对象共享类变量,即所有的对象的类变量是相同的一处内存空间,类变量的内空空间至于什么时候释放内存空间,这是大家想知道的,那么我告诉大家,类变量的内存空间直到程序退出运行,才会释放所占有的内存.其实说到这里,我们应该再随便说下类的方法,类的方法也分实例方法和类方法,那么有谁能告诉我实例方法和类方法有什么区别么?既然没有,那我自己来讲(呵呵..是这样的,类的实例方法是在只有类创建对象的时候才会被分配入口地址,而类方法,是当程序的字节码文件加载到内存就马上分配入口地址,这就是为什么实例方法可以调用类方法,而类方法不能调用实例方法的原因,也是类方法为什么不可以操作实例变量而实例方法可以操作类变量的原因(想想谁的入口地址先分配).那么有人会问,当我在创建一个对象的时候,实例方法和类方法是不是会被再次分配入口地址???其实不然,当你再创建一个对象时,实例方法是不会再分配入口地址的,也就是说,方法的入口地址是被所有对象共享的.类方法一开始就分配了入口地址,也不会再分配入口地址.讲到这里,也许有人还会问,那么方法的入口地址是什么时候才会被取消的呢?是这样的,类方法是直到程序退出运行才会被取消入口地址,而实例方法就不一样了,实例方法是当所有对象都不存在的时候,入口地址才被取消.其实这些东西是J2SE的基础内容,当你学会了内存分析,你自然就知道了.献丑了! 当你改变str的应用值后,GC就会收回 当你改变str的引用值后,GC就会收回 改变地变后,可以让JVM垃圾回收机制自动收回,可以用手动的方式收回 我想应该是当类A不再被调用的时候,然后GC根据自己的时间来收掉,因为他的周期是确定的,不是说你要他收就收的,等他工作的周期到了就开始新一轮的垃圾收集了 看一下JAVA的回收机制,相信对你有用,我个人觉得在A的对象为null是JVM就可以回收啦,到底具体在什么时候回收要看JVM的忙碌程度,比如说,你大学毕业后就可以考研啦,但你刚毕业就考研还是工作几年再考研,这个要看你是否有空去准备考研的原理一样,在A的对象为null时,看JVM 的忙碌情况来回收 这个贴竟然没有个结果,难道这还是未解之谜。我觉得不会被回收,因为调用 static 变量并不需要新建实例。 利用阻塞队列控制线程集? 日期计算 关闭模式对话框 有那位大哥帮一下MM呀!急救!MM在这里跪谢啦! 求助JComboBox组件的鼠标响应事件和键盘事件的代码!在线等待。20分 我的程序打了包(jar),就找不到加载的其它jar了,奇怪,为什么会这样??? 请帮忙看看这段程序错在那里? 问一个简单的问题 请问我想得到某个月的最后一天,该怎么做呢 请问 Ant是做什么用的,如何用? UDP广播地址的疑问? 关于三层结构中用接口的优点是什么?
第一:要明白Java虚拟机的工作原理。Java虚拟机要用到的类才会去加载的。
第二:要明白静态(static)的作用。当Java虚拟机加载该类的时候,就会将该类静态字符串加载到内存中,提供给它自己或者是它的所有对象共享,其他的类或者是其他类的对象都不能共享该字符串。如果该类没有被Java虚拟机用到了,就要被回收了,当然属于该类的静态字符串也同样被回收的。
你只想是想问:我没有引用类A,只是它被加载了,根本没对象(我根本没创建它,更没有子类),
我只引用了它的变量str,我程序里也没显示把str=null;那它什么时候会回收
我没说没加载,只是说没这对象
但这还不能证明joejoe 的观点
我比较同意amossavez 的说法,但是他没有说清楚.请看我的解释.
首先要知道java的成员变量分为:实例变量和类变量(也就是static变量).
当JAVA程序执行时,类的字节码文件就被加载到内存,如果该类没有创建对象,类的实例成员变量不会被分配内存,但是类中的类变量在类被加载到内存的时候,就分配了相应的内存空间.如果该类创建对象,那么不同的实例变量互不相同,即分配不同的内存空间,而类变量不再重新分配,所有的对象共享类变量,即所有的对象的类变量是相同的一处内存空间,类变量的内空空间至于什么时候释放内存空间,这是大家想知道的,那么我告诉大家,类变量的内存空间直到程序退出运行,才会释放所占有的内存.其实说到这里,我们应该再随便说下类的方法,类的方法也分实例方法和类方法,那么有谁能告诉我实例方法和类方法有什么区别么?既然没有,那我自己来讲(呵呵..是这样的,类的实例方法是在只有类创建对象的时候才会被分配入口地址,而类方法,是当程序的字节码文件加载到内存就马上分配入口地址,这就是为什么实例方法可以调用类方法,而类方法不能调用实例方法的原因,也是类方法为什么不可以操作实例变量而实例方法可以操作类变量的原因(想想谁的入口地址先分配).那么有人会问,当我在创建一个对象的时候,实例方法和类方法是不是会被再次分配入口地址???
其实不然,当你再创建一个对象时,实例方法是不会再分配入口地址的,也就是说,方法的入口地址是被所有对象共享的.类方法一开始就分配了入口地址,也不会再分配入口地址.讲到这里,也许有人还会问,那么方法的入口地址是什么时候才会被取消的呢?
是这样的,类方法是直到程序退出运行才会被取消入口地址,而实例方法就不一样了,实例方法是当所有对象都不存在的时候,入口地址才被取消.
其实这些东西是J2SE的基础内容,当你学会了内存分析,你自然就知道了.献丑了!
比如说,你大学毕业后就可以考研啦,但你刚毕业就考研还是工作几年再考研,这个要看你是否有空去准备考研的原理一样,在A的对象为null时,看JVM 的忙碌情况来回收