JVM----垃圾回收

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值