zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    506Relative Ranks(LeetCode)
    计算二进制中1的个数
    vector<vector<int>> 简单知识介绍
    167. Two Sum II
    561. Array Partition I(LeetCode)
    sizeof 用法部分总结
    530. Minimum Absolute Difference in BST(LeetCode)
    JS计算两个日期之间的天数
    路演会上会登记结论的委员信息页面
    eclipse安装SVN插件
  • 原文地址:https://www.cnblogs.com/haerwang/p/10030718.html
Copyright © 2011-2022 走看看