一个实例的内存释放问题 绝对谈不上“对GC的回收机制比较熟悉”,只知道一点点 GC 常识而已。GC 总是在后台运行,你不能确定它何时执行,也就是说它的运行(何时执行清理)不以程序员的意志为转移。当一个对象成为不可访问的时候(没有任何引用指向它了),称“符合垃圾收集条件”。一般情况下,都会在一个合理的时间内得到清理。因为 GC 的运行要一定的成本,因此,在编程中应当适当考虑减少 GC 的负担,一般不要大量地创建生命期非常短的小对象就行了。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 java不是已经说了等到系统没有内存可用的时候才会进行垃圾收集么 set a = null;有时候是没有必要为了这些特意去做, 比如局部变量。主要是给予 变量比较准确的可见性,不要让他们在应该释放时还保持着未期望的引用。 可以调用System.gc();进行垃圾回收。 即使System.gc()也不是马上进行回收,分配空间是在定义变量的时候,例如PersonBean bean = null ; ( 如果仅仅定义一个引用其实并没有分配空间,PersonBean bean ;)回收的时刻不确定,但条件确定,就是当这个实例没有被引用,或者引用他的实例都被置null .gc会在适当的时刻回收,此时可具体不定。 GC回收的时机是不确定的,你的代码不应依赖GC的回收时机。GC也有很多算法:懒散机制,遍历机制等,有兴趣你可以google一下。 不过,对一些全局的变量,在确定废弃时应该显式的null 为什么SUN不把垃圾回收让程序员去控制呢?这样不是更好吗? 内存回收是不同线程里运行的,与用户程序线程不同步,也就是说内存的回收对于程序开发者来说是不可控的.听说这是为了让程序运行更安全,解放程序员,不用自己回收空间又听说现在的JAVA的GC改进了,性能更好.看过一点点书..NET采用三代GC策略,JAVA采用二代GC策略(分为主,次两个) 大家请看这篇文章http://mywelt.net/?q=comment/reply/524我比较认同作者的观点。我觉得一些占用内存资源的对象,应该在使用完后,赋一个NULL值。因为一个给一个对象赋NULL值,就等于告诉垃圾回收器,这个对象已经没有被引用,这时,一旦GC运行时,就会被回收。 那我如果一开始初始化String s=null会启动GC吗?是String s="";好还是String s=null;好啊? suyejun2005 ,你看看我上面所说的,你提这个问题是没理解好我上面的几段话。 当一个对象有一个或一个以上的对象引用指向它时,这个对象处于有效状态。当没有一个引用指向它时,该对象被废弃。但是,被废弃并不意味着它所占有的空间被回收。只有当Java的垃圾回收机制认为该回收此空间时才被回收。你可以在你的代码里写:System.gc()但是,这并不能使回收立即发生。System.gc()只是催促,而不是命令。在你的Java代码里,没有办法可以真正控制回收动作。 谢谢terry_yip,我不是在质疑你,我只是想问一下如果String s=null,系统一开始会不会给它分配内存啊?如果分配了内存,但是我程序后面没有用到这个s,那么s肯定会被GC的,如果没有分配显然是最好的,因为没有无故地去浪费内存了所以我想问一下String s=""是不是被分配内存的?两种定义方式在写程序的时候哪个比较常用呢?谢谢 java jsp显示对数据 求帮助 关于向服务器欺骗浏览器类型的问题 JavaWeb程序实现注册码方案 求struts2高手 tomcat 下使用 log4j 问题 急!如何在java中执行一个有返回值的Sql Server 2000存储过程? Eclipse+tomcat怎么调试jsp页面 struts的问题:Struts中的properties文件中我用了着样一句logon.jsp.page.heading=你好! 关于类信息的获取,判断问题 两个List如何用一个是示出来? 在JSP页面中应用STRUTS标签以后出现了空指针异常,以下是我的JSP代码
回收的时刻不确定,但条件确定,就是当这个实例没有被引用,或者引用他的实例都被置null .
gc会在适当的时刻回收,此时可具体不定。
GC也有很多算法:懒散机制,遍历机制等,有兴趣你可以google一下。
与用户程序线程不同步,
也就是说内存的回收对于程序开发者来说是不可控的.
听说这是为了让程序运行更安全,解放程序员,不用自己回收空间
又听说现在的JAVA的GC改进了,性能更好.看过一点点书.
.NET采用三代GC策略,JAVA采用二代GC策略(分为主,次两个)
http://mywelt.net/?q=comment/reply/524
我比较认同作者的观点。我觉得一些占用内存资源的对象,应该在使用完后,赋一个NULL值。因为一个给一个对象赋NULL值,就等于告诉垃圾回收器,这个对象已经没有被引用,这时,一旦GC运行时,就会被回收。
是String s="";好还是String s=null;好啊?
但是,被废弃并不意味着它所占有的空间被回收。只有当Java的垃圾回收机制认为该回收此空间时才被回收。你可以在你的代码里写:
System.gc()
但是,这并不能使回收立即发生。System.gc()只是催促,而不是命令。在你的Java代码里,没有办法可以真正控制回收动作。
所以我想问一下String s=""是不是被分配内存的?两种定义方式在写程序的时候哪个比较常用呢?谢谢