很多书上说,当某个对象不存在对它的引用的时候即被当做垃圾,有可能被不定时的回收。
但对于那些临时对象或者说一次性的对象比如:
         System.out.print("java");
        new Dog().someMethod();//字符串对象"java” 和对象dog new 出来并没有赋给某个引用变量
 我不明白的是像"java" ,dog这样的对象会不会被当成垃圾,恰恰刚被new出来就被回收了,毕竟垃圾回收器的运行是一个独立的
 进程。JVM是怎么处理这种情况的,哪位高手能帮我解惑,谢谢!

解决方案 »

  1.   

    我也不是很懂垃圾回收机制,好像刚new出来的对象是放在对象池中,应该不会一new出来就被回收
      

  2.   

    一定时间后不存在对它的引用才会被回收,怎么会刚new出来就被回收呢?
      

  3.   

    字符串对象“java” 是字符串常量,它不用的话会放到字符串常量池中,而垃圾回收只能回收堆上的对象
      

  4.   

    不会出现,刚new出来的对象就被回收的情况,
    引用可以分类
    只有弱引用(定义时候进行说明),才最有可能被回收
      

  5.   

    直接用new dog()来调用方法而没有一个指向它的引用的话,
    意味着你下次就不能再找到这一个对象了。
    这样的话它到一定时间就会被垃圾回收的。 
      

  6.   

    请参考:(JAVA)
    1 对象可能不被当做垃圾来收集、
    2 Garbage collection is not desturction
    3 垃圾收集的工作仅仅和存储空间有关
      

  7.   

    楼主的担心是正确的。确实有可能出现这种情况。这就说明程序中去new这些对象做得是无用功。而楼主的例子中的两个对象。
    其中java是可能会被JVM当作字符常量放入到资源池中(要看具体的JVM),这样它就没有那么容易被GC销毁掉了。
    而dog对象在执行完someMethod()方法后,就完全有可能被GC发现了。
    当然GC通常都是有一定的条件触发的,比如定时,内存空间到达某个线等等。
      

  8.   

    照楼上所说,如果恰恰在dog刚被new出来还没来得急调用someMethod()方法的时候,gc()被触发了将会发生什么呢?
    jvm如何保证dog不被不被当成垃圾回收呢!
      

  9.   

    看看关于JAVA虚拟机的书。比如:深入JAVA虚拟机。
      

  10.   

    new Dog().someMethod(); 执行完了匿名dog对象是存在的, 只是它没有再被使用的机会并在等待GC处理
      

  11.   

    字符串对象“java” 是字符串常量  你不用它它还会在常量池中
    而dog对象当你new出来以后就没有任何引用指针指向它了
    那么它就会被垃圾回收机制回收
    但java的垃圾回收机制你无法预知它何时执行
    按照设计初衷 java回收机制只会在虚拟机发现内存不够时才会启动
    也就是说当你new出dog时调用其方法 系统内存肯定是够用的
    所以无需担心它一new出来就被回收掉
      

  12.   

    所谓的垃圾回收就是这样的:1:采用树的形式,来对未到达的节点的后面所有进行自动回收2:通过JVM的阀值来进行自动的定时的回收3:通过调用X=null这样的语句来将引用中指向的地址清除,JVM会在恰当的时刻进行各个区与Stack中引用的指向判断,从而对内存进行回收给分
      

  13.   

    楼主的担心不无道理,这牵扯到JVM内部的一些核心问题,关注中
      

  14.   

    最好去看看《深入Java虚拟机》或者是《Java优化编程》
      

  15.   

      我帮楼主看了看<< Inside java Virtual Machine>>,既使是临时对象刚被NEW出来的时候gc()恰好运行了,临时对象
    空间也不会回收,因为此时对此对象来说java virtual machine 会先运行此对象的finalize()方法.当下一次gc()运行时java virtual machine还要判断是不是没有引用指向该对象,如果是才有可能被回收.这是因为finalize()方法可能会使一个推动引用的对象重新获得引用.当然java的垃圾回收机制是一个很复杂的问题,我以上所说也不完全正确,楼主可以简单的这么认为.