微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JVM内存模型

运行时:

线程共享部分:

  heap; (待更新)

  methodArea(<=1.7为prem永久代;>=1.8为MetaSpace元空间) 

私有部分,每开启一个线程都有:

  pc(程序计数器  存放指令位置,记录操作,确认下一个操作,类似于操作++);

  jvm stack(虚拟机栈 由一个个frame组成(一个方法就是一个frame)); 

    frame由四部分组成: 1)local variable本地变量表 (存变量); 2)操作数栈 (用于记录操作);  3)Dynamic Linking 动态链接方法里面引用的其他方法链接等);   4)return address 返回值指针(用于跳回上一个方法

  本地方法栈 (native 方法);

 

硬件层面缓存原理: cpu的数据一致性实现:缓存锁+锁总线

cache line : 缓存行,64bytes为一行,cpu最小读取单位。

引出概念:

   1)缓存一致性协议(缓存锁 MESI):window 操作系统采用MESI:分4个状态:modify(已修改) ,excution(独占), share(共享,这个可能不对), fail(失效)

   2)伪共享概念,缓存行对齐,为了提高效率,可增加对象的变量使一个对象独占一个缓存行。

   3)写合并: WCbuffer(4bytes 的空间用于写指令保存。) 

   4) 乱序问题:不相关的操作指令可能是乱序执行,只要最终结果一致。如读取内存数据导致的乱序(cpu运算速度是内存的上百倍);

如何保证不乱序?增加屏障:

cpu级别: sfense (save/store 写屏障) , lfense (load 读屏障), mfense (mix 读写屏障)

jvm:  读操作:load1/load2  load1/store2   在进行2的读取或写操作前保证1读完

         写操作:store1/store2  store1/load2  在进行2的读或写前保证1写完对其他处理器可见

java:

     增加validate   实现细节: 字节码:ACC_VALIDATE                  JVM 增加屏障                OS和硬件层面   采用lock或者各种fense

     synchronized实现细节:     字节码:ACC_SYNCHRONIZED   JVM  调用OS提供的同步机制   OS和硬件层面   lock compareAndExchange 

存储结构:

cpu 1ns  > wcBuffer >  L1(一级缓存) 3ns  >  L2 (二级缓存) 15ns > L3 (三级缓存)  > 内存   > 硬盘

对象结构:

    对象头  markword   8位  (包含锁信息1+2位(00无锁   01轻量级锁  10  重量级锁   11   01 偏向锁)   对象hashcode地址)

    classpoint 对象指针   8位  根据开启内存压缩参数可压缩成4位

    数据

    padding (对象只能是8的整数倍,不达到的需要补齐);

对象大小: 通过上面可得出一般(8+4+0+4)16位;  数组结构多一个数组数量int   所以不压缩的话是(8+8+4+4)24位,压缩也是(8+4+4)16位

对象定位:句柄池(在堆内存开辟一个池子,一个指向对象,一个指向class) 或 直接指针 (直接找到堆内存中的对象地址,再指向class地址)

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐