java面试题——内存管理

2018-05-12  本文已影响9人  coder_斛律光

java 虚拟机运行时数据区域

线程执行字节码的行号指示器 所以是每个线程都有一个 (线程隔离的数据区)
java 虚拟机中唯一一个没有规定任何情况的oom的区域

每个线程都有一个虚拟机栈(线程隔离的)
每个方法都是栈中的栈帧

1 临时变量表
2 操作数栈
3 动态链接
4 方法出口

如果栈的深度超过了java虚拟机所允许的深度 stackoverflow
如果虚拟机栈允许动态扩展 扩展的时候没有足够的内存 oom

和java虚拟机栈类似 只不过指定的是native方法

垃圾回收的主要区域 也叫gc堆

新生代( 一块大的伊甸区 两个小的幸存1 幸存2 ) 老年代

存放的主要是对象实例
创建实例无法申请到内存 oom

存放的已加载的类的信息 常量 静态变量 即时编译的代码
运行时常量池 不一定是编译时候确定的常量 运行期间也可以将新的常量加入 string.itern
当常量池无法在申请到内存时 oom

虚拟机中的对象

  1. 遇到new的指令 首先区常量池中找这个类的符号引用 然后检查 这个类是否被加载 如果没有 就加载这个类
  2. 为新生对象分配内存 java堆内存规整的 用指针碰撞 不规整的用空闲列表
  3. 内存空间都初始化为0 理解为字段初始化 不包括对象头
  4. 设置对象头信息 (类型指针 hash码 gc年龄代 如何能找多对象的元数据信息 锁状态 线程持有的锁 )
  5. init 方法
上一篇 下一篇

猜你喜欢

热点阅读