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、对象怎么分配

 

posted @ 2022-03-23 19:40  showMeTheCodes  阅读(30)  评论(0编辑  收藏  举报