运行时:
线程共享部分:
heap; (待更新)
methodArea(<=1.7为prem永久代;>=1.8为MetaSpace元空间)
私有部分,每开启一个线程都有:
pc(程序计数器 存放指令位置,记录操作,确认下一个操作,类似于操作++);
jvm stack(虚拟机栈 由一个个frame组成(一个方法就是一个frame));
frame由四部分组成: 1)local variable本地变量表 (存变量); 2)操作数栈 (用于记录操作); 3)Dynamic Linking 动态链接 (方法里面引用的其他方法链接等); 4)return address 返回值指针(用于跳回上一个方法)
硬件层面缓存原理: 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] 举报,一经查实,本站将立刻删除。