正在看sun的内存管理白皮书,发现这一句:It is also desirable that a garbage collector operate efficiently, without introducing long pauses during which the application is not running.是不是说在gc的时候application会稍微停止一下?是啥意思?

解决方案 »

  1.   

    会有这问题的,越早的jvm应该越明显
      

  2.   

    看到后面的时候发现有一条是在并发和stop-the-world之间做选择,在进行并发回收的时候有时也需要stop-the-world,请问下为啥需要停止应用程序,也就是冻结内存~~~那些是垃圾的对象不是已经存在在那个地址,然后回收那块地址就好了?冻结内存的理由是不是为了拷贝活对象的时候保证数据一致性?
      

  3.   

    举个例子说:在new对象的时候都需要一片连续的内存,假设要4M,经过几次回收之后,内存没有连续的4M内存了,虽然总的空闲空间大于4M,这就需要移动对象吧?移动对象必然涉及指针地址的变化吧,如果不让使用这些引用的程序暂停一下,怎么改变了他们的引用岂不是出问题了,只有暂停一下,把移动的那些对象的引用地址都更新掉,再回复程序执行
      

  4.   

    你这个应试进行压缩(compaction)的益处,这样减少fragmentation,容易找到大的连续区域分配给新对象。但是我想知道进行内存冻结(freeze the heap)的理由是啥?操作系统没学好真的蛋疼。
      

  5.   

    要是采用分页存储就不会有这个问题了吧,呵呵~~~不过Eden中的对象是在进行多少次回收还能存活下来才被拷贝到From中去的?是Eden存储的对象超过一定阀值后才被copy过去呢还是怎样?
      

  6.   

    这就看jvm以及垃圾回收算法怎么设计了,没有统一的说法,IBM J9,oracle hotspot,oracle jrockit的回收算法应该都是不同的,对象设计也是不同的
      

  7.   

    囧了,对于串行回收,应该是从Eden拷贝到To,经过一次回收之后Eden和From都是空的,然后把To改为From,From改为To
      

  8.   


    嗯,我在看Hotspot VM的内存管理