深刻JVM-自动内存管理(读书笔记)
自动内存管理
- 运行时数据区域
-
- 程序计数器
- Java虚拟机栈
- Java方法执行的线程内存模型
- 每一个方法在Java方法中的体现是栈帧
- 本地方法栈
- Java堆
- 被全部线程共享
- 惟一目的是存放对象
- 垃圾收集器管理的内存区域(因此也有人称之为”GC“堆)
- 堆内实际有线程私有的对象缓存区,来提高线程获取对象的效率
- 方法区
- 与方法自己的关系并不大,而更多的是存储的常量、静态变量、类型信息等。
- 运行时常量池
- 直接内存
- HotSpot虚拟机与堆中对象分配、布局、访问
- 对象分配
- 可用空间的划分
- 规整的状况下:平移指针
- 不规整的状况下:空闲列表
- 并发冲突
- 内存初始化
- 构造函数初始化
- 对象内存布局
- 对象的访问
- 经过栈上的reference访问
- 经过句柄来访问
- 经过指针来访问(HotSpot采用)
垃圾收集器与内存分配策略
-
对象是否”死亡“算法
-
引用的分级缓存
- 只用”被引用“和”未被引用“没法充分描述对象的引用情况
- 好比对于这种场景:当内存空间还足够时,能保留在内存之中,若是内存空间在进行垃圾收集后仍然很是紧张,就扔掉它(缓存)
- 强引用
- 指在程序代码之中广泛存在的引用赋值,即相似“Object obj=new Object()”这种引用关系
- 软引用
- 有用,但非必须的对象
- 只被软引用关联着的对象,在系统将要发生内存溢出异常前,会把这些对象列进回收范围之中进行第二次回收,若是此次回收尚未足够的内存,才会抛出内存溢出异常
- SoftReference
- 弱引用
- 被弱引用关联的对象只能生存到下一次垃圾收集发生为止
- WeakReference
- 虚引用
-
垃圾收集算法并发
- 分代收集理论
- 弱分代假说:绝大多数对象都是朝生夕灭
- 强分代假说:熬过越屡次垃圾收集的对象越难消亡
- 跨代假说:跨代引用仅占少数
- 收集器应该将Java堆划分出不一样的区域,而后将回收对象依据其年龄(年龄即对象熬过垃圾收集过程的次数)分配到不一样的区域之中存储
- 标记清除算法
- 主要问题
- 容易缠身过多的空间碎片
-
- 标记复制算法
- 内存分两办,用一半,剩下的一半在每次垃圾收集的时候,存放活着的对象,原来的一半被清空
- 主要问题
- 若是存活对象过多,那么复制开销大
-
- 标记-整理算法
- 标记清除+移动
-
-
HotSpot的算法细节实现函数
-
经典垃圾收集器布局
欢迎关注本站公众号,获取更多信息