zoukankan      html  css  js  c++  java
  • Java提高——Java的内存回收(2)

    Java的内存泄漏

    内存泄漏:程序运行过程中,不断的分配内存空间,那些不再使用的内存空间应该即时回收,,从而保证系统可以再次使用这些内存。如果存在无用的内存没有被回收,那么就是内存泄漏。

    垃圾回收机制

    垃圾回收机制主要完成以下两件事:

    1、跟踪并监控每个Java对象,当某个对象处于不可达状态则回收该对象所占用的内存

    2、清理内存分配、回收过程中产生的碎片

    垃圾回收的基本算法

    实际上,垃圾回收机制不可能实时监测到每个Java对象的状态,因此当一个对象失去引用之后,它不会被立即回收,只有等垃圾回收运行时才会被回收。

    垃圾回收的涉及算法大致如下:

    串行回收和并行回收:串行回收就是无论多少个CPU,始终只用一个执行垃圾回收操作;并行回收就是把整个垃圾回收工作分成多个部分供多个CPU负责,让多个CPU并行回收,效率很高,复杂度增加,但是产生的碎片很多。

    并发执行和应用程序停止:应用程序停止的垃圾回收方式会导致应用程序的暂停,并发执行垃圾回收的方式需要解决和应用程序的冲突问题,因此开销比较大。

    压缩和不压缩和复制:

        压缩(标记压缩):把所有活得对象搬到一起,将之前占用得内存全部回收

        不压缩(标记清除):只是回收内存,且回收回来得内存是不连续的,会有更多碎片。(且回收回来的内存块分配更慢,无法解决碎片问题)

        复制:将所有对象复制到另一块相同的内存中,不会产生内存碎片,但是需要复制数据和额外的内存。

    现行的垃圾回收器用分代的方式来采用不同的回收设计。根据对象的生存时间长短,把堆内存分成3个代:

    Yong(年轻代)、Old(老年代)、permanent(永久代)

    堆内存分代回收

    分代回收依据对象的生存时间的长短,然后根据不同代采取不同的垃圾回收策略。

    采用“分代回收”的策略基于如下事实:

    1、绝大多数的对象不会被长时间引用,这些对象在Yong期间就会被回收;

    2、很老的对象和很新的对象之间很少存在相互引用。

    一、Yong代

    Yong代采用复制算法,只需要遍历那些处于不可达状态的对象,而且对象的数量少,复制成本小,能充分发挥复制算法的优势

    二、Old代

    Old代垃圾回收具有如下两个特征:

    1、Old代垃圾回收的执行频率不会太高,因为很少有对象死掉

    2、对每次Old代执行垃圾回收需要更长的时间来完成。

    基于以上,通常采用标记压缩算法,避免复制Old代的大量对象,且不会大量产生碎片,比较划算。

    三、Permanent代

    Permanent代主要用于装载Class、方法等信息,默认64M,垃圾回收机制通常不会回收Permanent代中的对象。

    常见垃圾回收器

    1、串行回收器

    对Yong代和Old代的回收都使用串行(只使用一个CPU),且运行期间会使程序暂停。Yong代采用串行复制算法,Old代使用串行标记压缩算法。

    2、并行回收器

    Yong代与串行回收相似,只是启用了多个CPU,多线程;Old代采用与串行回收相同的算法,不管有几个CPU都采用单线程、标记整理的方式进行回收。

    3、并行压缩回收器

    4、并发标识-清理回收器(CMS)

    内存管理小技巧

    1、尽量使用直接量

    如:String str = “123”;而不是String str = new String(“123”);

    2、使用StringBuffer和StringBuilder进行字符串链接

    3、今早释放无用对象

    4、尽量少使用静态变量

    5、避免在经常调用的方法、循环中创建Java对象

    6、缓存经常使用的对象

    7、尽量不要使用finalize方法

    8、考虑使用SoftReference

  • 相关阅读:
    Debian 7 amd64 + fbterm + ucimf
    golanggorilla/mux,强大的URL路由和调度器
    Debian 7 amd64问题
    在mysql启用远程连接
    golang从类型转换角度看interface
    golang监控goroutine异常退出
    golangRedis最佳的Go语言驱动
    usaco Scrambled Letters
    usaco Milk Routing
    滚动数组出错的原因都有那些?&poj3254
  • 原文地址:https://www.cnblogs.com/huangzhe1515023110/p/9276088.html
Copyright © 2011-2022 走看看