JVM调优(三)(四)
一、硬件层数据一致性
L0、L1、L2三层在一个CPU中,其余为共享空间
若x、y在主存中,主存将x、y加载到L3中。每个cpu都会缓存L3中数据,若此时cpu1将x变为1,cpu2将x变为2。则会造成数据不一致情况
解决办法:加总线锁,当cpu1操作x时,cpu2不能操作L3。以此来保证数据一致性
问题:cpu1操作x时,cpu2如果想操作cpu2也是不行的,那么就会造成效率降低
引出MESI缓存一致性协议
Modified:缓存中数据与主存相比是否进行了修改,如果更改了将主存中数据标记为Modified
Exclusive:主存中数据是否为我cpu独享
Shared:我读的时候别人也在读
Invalid:我读的内容被其他cpu改过,为无效。此时重新读取数据,进行操作
最终解决方案:缓存一致性协议(MESI)+总线锁
二、缓存行与伪共享
假设x与y在同一缓存行中,每个cpu从主存中拿数据时,会拿64字节的数据,这64字节称为一个缓存行
伪共享:x与y在同一个缓存行中,被同时加载到了每个cpu中。cpu1中要修改x,cpu2要修改y,两个cpu要修改的变量不同,但是cpu1中修改了x,提交后,cpu2还未提交,这时就要求cpu2重新加载缓存行。
解决办法:使用缓存行的对齐能够提高效率。即在缓存行中存放变量,该变量前或后填充7个long类型的变量。用空间换时间
三、乱序问题
cpu运行的效率是内存的100倍
当cpu要运行一条指令a,a指令需要到内存中读数据,因为cpu与内存的效率差别巨大,所以此时cpu会执行与a指令无关的b指令
因为要读数据,a指令只能一直等着,这样浪费了cpu,所以执行b指令
四、对象的内存布局
1、对象的创建过程
将class文件load到内存-->申请内存空间,成员变量赋默认值-->调用构造函数,赋初始值-->对象指向内存空间
2、对象在内存中的存储布局
8字节的markwork
4字节的类型指针,指向class对象 例:T t = new T(); class指针指向T.class
成员变量
8字节对齐
3、对象头具体包括什么
3位代表对象是否被锁定,4位gc信息(从年轻代到老年代最大15岁,二进制为1111),hashcode
4、对象怎么定位
直接指针
5、对象怎么分配
作者:http://cnblogs.com/lyc-code/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权力。