您的位置:首页 > 其它

JVM----垃圾回收

2018-03-29 15:39 239 查看
1.对象的创建
2.对象的内存分配方式
3.对象的内存结构
4..对象的访问方式
5.如何判断对象已死?
6.垃圾收集算法
7.垃圾收集器

1.对象的创建
1.先查看常量池定位到这个类的符号引用;2.然后查看这个类是否被加载、解析和初始化过,如果没有则执行;3.给新建对象分配内存
https://blog.csdn.net/tjiyu/article/details/53923392


2.对象的内存分配方式
1.指针碰撞:如果java堆是规整的,即所有用过的内存放在一边,没有用过的内存放在另外一边,并且有一个指针指向分界点,在需要为新生对象分配内存的时候,只需要移动指针画出一块内存分配和新生对象即可;
2.空闲列表:当java堆不是规整的,意思就是使用的内存和空闲内存交错在一起,这时候需要一张列表来记录哪些内存可使用,在需要为新生对象分配内存的时候,在这个列表中寻找一块大小合适的内存分配给它即可。而java堆是否规整和垃圾收集器是否带有压缩整理功能有关。

分配在新生代或老年代,如何进入老年代
默认新建对象放在新生区的Eden
如果新建的对象大于某一个值,直接存入老年区

新生代的对象没进行一次minor GC,有一个值就+1,大于15是就转移到老年区

3.对象的内存结构
对象头:(hash值.........,类引用)
实例数据
对其填充,总位数为8的整倍数。
https://blog.csdn.net/zhoufanyang_china/article/details/54601311

4.对象的访问方式
指针直接访问,指针直接指向对象的内存地址(快)
使用句柄访问,jvm中会建立一个句柄池,引用指向句柄池,句柄池指向对象实例数据和对象类型数据(对象被移动回收,不用修改引用地址,只用修改句柄地址)
https://blog.csdn.net/jcncsdn/article/details/51317302


5.如何判断对象已死?
引用计数算法:某一个对象被别的对象引用,值+1(无法避免对象相互引用的情况)
可达性分析:GC root
https://blog.csdn.net/sbvfhp/article/details/43371415

6.垃圾收集算法
标记-清除:可达性分析,可达对象加标记,清理没有标记的对象。(会产生很多空间不连续的内存碎片)
复制:将可用内存分半,每次只使用一块,当一块使用完之后,将仍存活对象复制到另一半上,此时使用另一半保存对象。(无空间碎片,缺点内存利用率比较低(正常是8:1:1,分配担保))
标记-整理
可达性分析,可达对象加标记,将标记的放在前面,未标记的放在后面,清理没有标记的对象。
分代收集算法
新生代对象绝大多数是朝生夕死,因此使用复制算法,老年代则使用标记-整理算法
https://blog.csdn.net/u011080472/article/details/51324103

7.垃圾收集器
serial(单,新),因为没有现成交互,效率更高,但是多CPU则不适用了
serial old(单,老)
parnew(多,新)
parallel(多,新,可控制的吞吐量(吞吐量=运行用户代码的时间/(运行用户代码的时间+垃圾收集时间)。),垃圾收集时间(手机时间不能超过这个值),直接设置吞吐量大小)
parallel old(多,老,可控制吞吐量)
cms(并行和并发,初始标记,并发标记,重新标记,并发清除)(确定,对CPU太敏感,收集分走一部分CPU,浮动垃圾,)
g1(初始标记,并发标记,最终标记,并发清除)并行与并发,分代收集,收集方式是内存空间较整齐,可预期收集;将对分为多个独立相等的独立区域
https://blog.csdn.net/u011116672/article/details/50994096
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: