C++需要手动式释放掉
Java有一个自动垃圾收集机制
对象创建
分内存
new关键字
类加载之后就知道所需内存大小
两种为对象分配空间的方式:指针碰撞(对象内存规整),空闲列表(不规整)
解决线程安全问题
TLAB本地线程分配缓冲(为java堆中每一个线程提前分配一块内存)(提前分配文件)(无锁并发)
CAS+失败重试
保证操作的原子性(全成功/全失败)
内存分配完成之后 初始化 0
然后 将一些信息存放到对象头
哪个类的实例
对象的哈希码等
对象的内存布局
1.对象头
存储对象自身的运行数据(MarkWord)
不同的标志位,代表不同的韩语
32或位
类型指针,对象直线对象时哪类的指
2.实例数据
(int a = 32) a存于哪里,如果是局部变量(在方法里面)是在虚拟栈中的,如果是对象中定义的是堆中
引用类型存储引用
基本类型存值
3.对齐填充
对象的访问定位
通过栈上的reference数据来操作
1.句柄
好处:reference中存储的是稳定句柄地
2.直接指针
好处:快,节省一次定位
垃圾收集策略
引用计数法:相当于在脑门上写数字,每有一个引用你,+1,直到有一个时刻引用为0
当涉及迭代,就解决不了循环依赖的问题可达性分析法:通过以一系列GC roots作为七十点,从这些结点开始,根据引用关系向下搜索,搜索过程走过的路径称为“引用链”,如果某个对象到GC Roots直接没有连接
固定作为GC Roots的对象
跨代引用
被同步锁持有的对象
Java虚拟机内部的引用的
本地方法中
常量引用的
方法区中
虚拟机栈中引用的对象
再谈引用
强引用:无论任何情况下,只要强引用关系还存在,垃圾收集器就永远不会回
收掉被引用的对象软引用:还有用,非必须(作缓冲),内存不够就回收
弱引用:非必须
虚引用:无用
分代收集理论
强分代假说
活得越长的对象活越倾向于活着
弱分代假说
大部分的对象朝生夕灭,生命市场短
跨分代引用假说
相对于同代引用来说,跨代引用占比非常少
垃圾收集算法
标记清除算法:
扫描当前区域所有对象 打一个标记 是否清除
清除标记了的
缺点:执行效率不稳定,空间碎片化
标记整理算法
扫描打标记
存活的对象向空间的一端移动
将边界外的清除
优点:消除空间碎片化
缺点:移动对象,比较消耗性能
标记复制算法
把空间一分为二
A满了之后将A复制到B,A清除
优点:实现简单,无空间碎片
缺点:可用内存缩小为原来的一般
存活的越少,性能越高,效率越高
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuo8.com 版权所有 湘ICP备2023022238号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务