本文仅作为复习清单使用
运行时数据区域
线程私有 :程序计数器,JAVA虚拟机栈,本地方法栈
线程共享 :堆,方法区,运行时常量池,直接内存
内存分配方式
指针碰撞
空闲列表
本地线程分配缓冲
堆在某种程度上,也存在线程私有的部分哦
对象的内存布局
对象头 : Mark word,类型指针
实例数据
对齐填充 :任何对象的大小都必须是8字节的倍数
对象的访问方式
句柄访问
直接指针访问
内存区域的异常
内存泄露
内存溢出
jdk6,7中的常量池
jdk6中,常量池位于永久代(方法区)
jdk7中,常量池位于堆中
jdk8中,元空间取代了永久代
判断对象是否存活
引用计数
可达性分析
GCRoot
虚拟机栈中的对象
类静态属性
方法区常量
本地方法引用的对象
虚拟机内部引用
被同步锁持有的对象
反映JVM内部情况的JMXBean,JVMTI 中注册的回调,本地代码缓存等 (?)
大佬博客
强引用
软引用
弱引用
虚引用
垃圾回收的过程
1.判断是否可达;
2.被标记,如果finalize()未被重写或者以及被执行过,直接进入第三步,否则,进入F-QUEUE,执行finalize()方法;
3.若仍然不可达,则回收
方法区的垃圾回收
条件苛刻,详见P74
分代假说
弱分代假说:决大多数对象都是朝生夕灭的
强分代假说:熬过越多次垃圾收集过程的对象就越难以消亡
夸代引用假说:跨代引用相对于同代引用仅占极少数
记忆集
在新生代上,将老年代分为若干块,记录哪些块会存在跨代引用
按分代的GC分类
一.部分收集(Partial GC)
1.新生代收集(Minor GC/Young GC)
2.老年代收集(Major GC/Old GC)
3.混合收集(Mixed GC)
二.整堆收集(Full GC) 包括方法区
垃圾清除算法
标记-清除
标记-复制 (Eden,Survivor)
标记-整理
OOPMap
记录对象中属性哪些是引用
安全点(本人暂时无法理解)
虽然暂时知道这是个什么东西,不过他为什么存在,我暂时无法理解.
安全区域
同上
卡表
记忆集的具体实现
写屏障
一个引用赋值的AOP切面
解决并发标记时,引用改变的bug
增量更新
原始快照
垃圾收集器
对象内存分配与回收策略
1.对象优先在Eden分配 (弱分代理论)
2.大对象直接进入老年代:短命大对象对系统性能有影响
3.长期存活的对象将进入老年代 (强分代理论)
4.动态对象年龄判定: 并非完全按照年龄决定谁进入老年代
5.空间分配担保:新生代内存不足,便直接把对象放入老年代
其他知识点
1.根节点枚举必须Stop The World
2.准确式内存:虚拟机可以知道内存中的某个数据是什么类型的