java 虚拟机运行时数据区域
- 程序计数器
线程执行字节码的行号指示器 所以是每个线程都有一个 (线程隔离的数据区)
java 虚拟机中唯一一个没有规定任何情况的oom的区域
- java虚拟机栈
每个线程都有一个虚拟机栈(线程隔离的)
每个方法都是栈中的栈帧1 临时变量表
2 操作数栈
3 动态链接
4 方法出口
如果栈的深度超过了java虚拟机所允许的深度 stackoverflow
如果虚拟机栈允许动态扩展 扩展的时候没有足够的内存 oom
- 本地方发栈(线程隔离的)
和java虚拟机栈类似 只不过指定的是native方法
- java堆(线程共享的)
垃圾回收的主要区域 也叫gc堆
新生代( 一块大的伊甸区 两个小的幸存1 幸存2 ) 老年代
存放的主要是对象实例
创建实例无法申请到内存 oom
- 方法区(线程共享的)
存放的已加载的类的信息 常量 静态变量 即时编译的代码
运行时常量池 不一定是编译时候确定的常量 运行期间也可以将新的常量加入 string.itern
当常量池无法在申请到内存时 oom
虚拟机中的对象
- 创建对象的过程
- 遇到new的指令 首先区常量池中找这个类的符号引用 然后检查 这个类是否被加载 如果没有 就加载这个类
- 为新生对象分配内存 java堆内存规整的 用指针碰撞 不规整的用空闲列表
- 内存空间都初始化为0 理解为字段初始化 不包括对象头
- 设置对象头信息 (类型指针 hash码 gc年龄代 如何能找多对象的元数据信息 锁状态 线程持有的锁 )
- init 方法
网友评论