• jvm垃圾回收器(《深入理解java虚拟机》)


    ---恢复内容开始---

    程序计数器、虚拟机栈、本地方法栈,这三个区域随着线程生,随着线程死。重复入栈出栈,还有基本确定 编译后 各区域所需要的内存大小是确定的。所以这部分回收不需要过多考虑。

    主要回收对象为堆、方法区。java动态原则,大多数对象都是运行期间才会被加载的,所以堆上的容量是动态(分配和回收)变化的。

    1.堆上回收内存(回收已死对象)

    怎么判断已死?

    每个类都有一个finalize()方法,,jvm判断一个对象是否死亡,先根搜索算法筛一遍,标记出不可达对象,,并放在一个队列中,由一个线程去逐个执行finalize()方法。若某个对象重写了finalize()方法,并且在此方法中成功讲自己连接出去了,,那就抹去标记,暂留狗命。若没有重写或没有成功推出自己,则只有等死。

    finalize()方法,在一次次回收中,,只会被系统调用一次。(?)

    finalize()一般被用在对象快死了,,释放被其占用的资源。但是 try finally  好像也可以。

    2.方法区回收

    这部分是有回收的,废弃的常量和 无用的类。

    3.垃圾回算法

    3.1标记回收

    先标记再回收:可能产大量碎片,,没有可以被分配的连续内存,效率也底。

    3.2复制算法

    两块一样大的内存,,一块用的差不多的了,,将上面活着的对象复制到另一块上,,原来的清空。

     

    3.3标记-整理算法

    让存活的对象自己想某个区域”靠近“,,然后回收这个区域端边接意外的内存。

    3.4分代收集算法

    4.垃圾收集器

    http://www.cnblogs.com/zuoxiaolong/p/jvm8.html

    5.内存分配与回收策略

    https://www.cnblogs.com/xiaoxi/p/6557473.html

  • 相关阅读:
    常见sql注入的防范总结
    Hadoop各个组件与端口
    Jenkins HA高可用参考
    zookeeper的主要应用
    Jenkins常见REST API(便于将Jenkins集成到其他系统)
    使用pscp/pslurp批量并发分发/回收文件
    kv数据库对比总结
    /usr/bin/curl: Argument list too long的解决方法
    优秀的开源监控系统梳理
    Linux socat轻松实现TCP/UDP端口转发
  • 原文地址:https://www.cnblogs.com/haerwang/p/10030718.html
Copyright © 2020-2023  润新知