java内存模型

1.单例模式

1.双重检测机制,
2.实例对象要用volatile关键字修饰,防止指令重排,对象在半初始化的同时被别的线程读取了对象的默认值

2.JMM

1.硬件层数据一致性,协议有很多
2.intel才用的是MESI cache一致性协议
3.现代CPU的数据一致性实现采用:缓存锁(一致性协议)+总线锁
4.位于同一缓存行的两个不同数据被两个或多个不同cpu锁定,产生互相影响的伪共享问题(当一个CPU改了该缓存行某个值,即使其他CPU不用此值,也需要重新将该缓存行从主存中load进CPU内存)

3.乱序问题

1.cpu为了提高执行效率,会在一条指令执行过程中(比如去内存读数据(慢百倍级别))去同时执行另一条指令,前提是两条指令没有依赖关系
2.cpu往L2缓存写数据时,写操作可以进行合并,就是使用一个叫WCBuffer的缓存区,WriteCombliningBuffer的速度比L1还要快,只有4个字节的位置填满了之后,写入L2缓存;所以当runCaseOne一次写6个字节时,比runCaseTwo两个循环一次写4个字节更慢,虽然runCaseTwo循环2遍
示例代码:

public static long runCaseOne() {
        long start = System.nanoTime();
        int i = ITERATIONS;
        while (--i != 0) {
            int slot = i & MASK;
            byte b = (byte) i;
            arrayA[slot] = b;
            arrayB[slot] = b;
            arrayC[slot] = b;
            arrayD[slot] = b;
            arrayE[slot] = b;
            arrayF[slot] = b;
        }
        return System.nanoTime() - start;
    }

    public static long runCaseTwo() {
        long start = System.nanoTime();
        int i = ITERATIONS;
        while (--i != 0) {
            int slot = i & MASK;
            byte b = (byte) i;
            arrayA[slot] = b;
            arrayB[slot] = b;
            arrayC[slot] = b;
        }
        i = ITERATIONS;
        while (--i != 0) {
            int slot = i & MASK;
            byte b = (byte) i;
            arrayD[slot] = b;
            arrayE[slot] = b;
            arrayF[slot] = b;
        }
        return System.nanoTime() - start;
    }

4.如何保证特定情况下指令不乱序

1.硬件内存屏障x86
1.sfence:即savefence,在sfence前的写操作必须在sfence后的写操作指令前完成,不影响读操作
2.lfence:即loadfence,在lfence前的读操作必须在lfence后的读操作指令前完成,不影响写操作
3.mfence:在mfence前的读写操作必须在mfence后的读写操作指令前完成
2.原子指令
如x86上的“lock …”,即lock指令加【指令】

5.JVM级别如何规范

1.loadload屏障
例:load1;loadload;load2;
2.storestore屏障

3.loadstore屏障

4.storeload屏障

volatile实现细节
1.字节码层面
加个acc_volatile指令
2.jvm层面
volatile内存区读和写前后都加了屏障,写操作:storestorebarrier;volatile写操作;storeloadbarrier;
读操作:loadloadbarrier;volatile读;loadstorebarrier;
synchronize实现细节
1.字节码层面
加上monitorenter;monitorexit;指令
2.JVM层面
调用操作系统同步机制
3.os和硬件层面
x86:lock +指令;

gc垃圾回收

java
GC处理垃圾
开发效率高,执行效率低
c++
手工处理垃圾
开发效率低,执行效率高

1.Root Serching(根可达算法)
GC roots(根),从这里开始顺藤摸瓜,摸不着的就是垃圾,可被回收
线程栈变量(jvm stack)
静态变量()
常量池
JNI指针
C或C++本地方法
2. reference count (引用计数)没有任何引用指向的对象就是垃圾,解决不了循环引用的垃圾回收

GC常用算法
1.mark-sweep(标记清除)
位置不连续,产生内存碎片,效率偏低(两边扫描)
2.copying(拷贝)
没有碎片,浪费空间
3.mark-compact(标记压缩)
没有碎片,两遍扫描,效率偏低,有对象移动过程,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值