面试之四:JVM内存区域分配

  • 1、程序计数器(线程私有)【不会OOM
    • 记录线程执行的代码位置,每个线程各自独有。
  • 2、栈:虚拟机栈和本地方法栈(线程私有)【会OOM和StackOverflow
    • 虚拟机栈
      • 每个JAVA方法在执行时都会创建一个栈帧。
        • 用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
    • 本地方法栈:同虚拟机栈。只是用于Native方法
  • 3、JAVA 堆(线程共享)【会OOM
    • 用于存放对象实例。
    • 垃圾收集器主要区域。
    • 细分为:新生代和老年代等
      • 从内存回收的角度来看,由于现在收集器基本都采用分代收集算法,所以Java堆中还可以细分为:新生代和老年代;再细致一点的有Eden空间、From Survivor空间、To Survivor空间等。
  • 4、方法区(线程共享)【会OOM(HotSpot也叫永久代)【+运行时常量池】
    • 主要存放:
      • 存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
    • 4.1 细分:运行时常量池(方法区的一部分)
      • 存放类加载后Class文件中的常量池信息(Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译期生成的各种字面量和符号引用)
  • 5、直接内存(非虚拟机运行数据的一部分,即系统中除分配给JVM虚拟机之外的内存)会OOM
    • 不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域。
    • 但这部分内存也被频繁使用,也可能导致OutOfMemoryError异常。
 
posted @ 2019-04-03 09:40  不无聊  阅读(231)  评论(0编辑  收藏  举报