美文网首页
java面试题——内存管理

java面试题——内存管理

作者: coder_斛律光 | 来源:发表于2018-05-12 01:32 被阅读9次

java 虚拟机运行时数据区域

  • 程序计数器

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

  • java虚拟机栈

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

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

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

  • 本地方发栈(线程隔离的)

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

  • java堆(线程共享的)

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

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

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

  • 方法区(线程共享的)

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

虚拟机中的对象

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

相关文章

网友评论

      本文标题:java面试题——内存管理

      本文链接:https://www.haomeiwen.com/subject/aaborftx.html