基本回收算法引用计数(Reference Counting) 
比较古老的回收算法。原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数。垃圾回收时,只用收集计数为0的对象。此算法最致命的是无法处理循环引用的问题。
标记-清除(Mark-Sweep) 
此算法执行分两阶段。第一阶段从引用根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除。此算法需要暂停整个应用,同时,会产生内存碎片
1.怎样的对象,叫做内存碎片?
2.为什么会产生内存碎片呢?

解决方案 »

  1.   


    .......你还真敢说啊当然会有影响,我们想象这样一个场景,有10MB内存,其中5MB是空闲的,5MB是已经使用的,
    用了的用1表示,没用的用0表示,如果内存分布式 1010101010,
    这时候假设应用程序需要申请5MB的空间,明明空闲的足够的,但是无法申请到,因为不连续
    如果1111100000这样排练,就OK了。不连续的,利用率低的内存分布就是内存碎片,实际使用中,如果内存碎片太多,
    那么对于需要空间比较大的情况,就只能用外存储器做虚拟内存,进行换页,
    而外存要比内存慢多了,而且换页也需要OS调度是有开销的,所以要尽量在内存中保证有一块连续的空闲产生内存碎片的原因举例来说,比如申请内存的顺序和释放的顺序不一样,比如前面那个10MB,
    我1次申请1个1MB的对象,10次以后用光了内存 ,但是我只释放2 4 6 8 10 号对象,
    13579我暂时不释放,这样就产生了不连续。说开来去就复杂了我也不太懂,仅说点我知道的基本原理。
      

  2.   

    内存碎片是指一系列不连续但是可用的存储单元
    表述可能不精确
    在这种情况下就是碎片了
    比如3kb 1kb 5kb
    这三个内存区域是连续的
    现在1kb这个垃圾回收后空闲了
    但是想分配一个2kb的内存
    1kb明显不够
    这就产生碎片了
    楼主描述中的情况只清除了内存区域而没有做对象移动或其他类似操作
    内存碎片是必然的
      

  3.   

    另外你可以看看这篇文章,里面介绍得很详细,
    关于内存碎片
    http://cache.baidu.com/c?m=9f65cb4a8c8507ed4fece763105392230e54f76238d586482ec3933fc239045c163bbffd707e5619d0c7616504ae4b41eaf12b7236062bbd9fc89f4da9bd922c2f8e2d37700b863653895ff09552609c60c655fede1ff0cc8325e3a8c5a4db4352ba44740a9787804d7110dd1c81&p=882a91459e9512a05eb7853b525f&user=baidu&fm=sc&query=%C4%DA%B4%E6%CB%E9%C6%AC&qid=95aa27d02235e0c0&p1=3