一、1.程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。
2.处于线程独占区
二、1.虚拟机栈。描述的是Java方法执行的动态内存模型
栈帧
局部变量表
outofMemory,stack
三、堆
存放对象实例
垃圾收集器管理的主要区域
新生代,老年代
-Xms -Xma
outofMemory
四、方法区 存储虚拟机加载的类信息,常量,静态变量等数据
垃圾回收在方法区的行为
异常的定义
五、其他 运行时常量池(在方法区)、直接内存
六、给对象分配内存,初始化对象,执行构造方法
(1)指针碰撞
(2)空闲列表
线程的安全性问题
对象的结构
- Header(对象头)
- 自身运行时数据
- 哈希值,GC分代年龄,线程持有的锁,偏向线程ID
- 自身运行时数据
- 类型指针
- InstanceData
对象的访问
句柄
直接指针
垃圾回收
如何判定对相关为垃圾对象
1.引用计数法 2.可达性分析(定义GCROOT:虚拟机栈,方法区常量或类属性所引用的对象,本地方法栈)
怎么回收
1.标记清除算法
效率问题、空间问题
2.复制算法
解决空间问题
3.标记整理
何时回收
seriral(需要停止)
最基本,历史最悠久
单线程垃圾收集器,桌面应用
ParNew(需要停止)
多线程
Parallel
复制算法(新生代收集器)
多线程收集器
达到可控制的吞吐量
XX:MaxGCPauseMillis 垃圾收集器最大停顿时间
XX:GCTimeRatio 吞吐量大小
吞吐量:CPU用于运行用户代码的时间与CPU消耗的总时间的比值
CMS收集器 Concurrent Mark Sweep
用于老年代
工作过程
初始标记,并发标记,重新标记,并发清理
优点
并发收集,低停顿
G1
对象分配原则
1.优先在Eden区域分配
2.大对象直接分配到老年代
3.空间分配担保,向老年代借用内存
4.长期存活对象进入老年代
逃逸分析与栈上分配
:分析对象的作用域:仅在当前方法中有效,就没有发生逃逸