JVM-java内存区域与溢出

1,运行时数据区

  线程共享:堆区,方法区

  线程私有:虚拟机栈,程序计数器(PC),本地方法栈

  程序计数器:代码地址,没有OOM

  java虚拟机栈:

    栈帧(局部变量表,操作数栈,动态链接,方法出口)

    异常:StackOverflowError(线程请求的虚拟机栈深度>虚拟机允许的最大深度),OOM(虚拟机栈动态扩展无法申请到足够内存)

  本地方法栈:

    Hotspot中与虚拟机栈合二为一

    异常:同虚拟机栈,StackOverflowError,OOM

  堆区:对象实例

    分代收集算法中的分区:新生代(Eden,From Survivor,To Survivor),老年代

    内存分配角度:TLAB

    -Xmx -Xms

    OOM(没有内存,且无法扩展)

  方法区:类信息,常量(常量表),静态变量,JIT编译的代码

    非堆区

    永久带

    -XX:MaxPermSize

    OOM(申请不到内存)

    运行时常量池:编译期生成的字面量和符号引用,翻译出来的直接引用,OOM

2,非运行时数据区

  直接内存:

    堆外内存

    DirectByteBuffer.allocate

    OOM(申请不到内存)

 

3,对象内存

  对象创建的内存分配:

    指针碰撞:Serial,ParNew,带压缩过程GC收集器

    空闲列表:CMS这类标记清除类GC收集器

    多线程创建对象的同步处理:

      CAS+失败重试

      TLAB:+/-UseTLAB

  对象的内存布局:

    对象头

      Mark Word:hashcode,GC分代年龄,锁状态标志,线程持有的锁,偏向线程ID,偏向时间戳

      类型指针:类元数据指针(哪个类的实例)

      数组长度:紧数组对象拥有

    实例数据

      字段内容

    填充对齐

      占位符,对象起始地址8字节的整数倍

  对象访问定位:通过栈上的reference类型来访问

    句柄

    直接指针:Hotspot的方式

      

posted on 2018-01-11 23:19  Vindia  阅读(226)  评论(0)    收藏  举报

导航