如何打破双亲委派机制

继承ClassLoader类后重写loadClass方法

如何指定自定义ClassLoader中的parent

默认parent是appClassLoader,可以通过ClassLoader构造方法指定

存储器的层器结构

为什么要缓存行对齐

有多个CPU或者多个核,他们都有自己的高速缓存,但是高速缓存都是先从内存中的L3高速缓存中读数据,每次读一行也就是64字节。所以当多个CPU或者多个核从L3高速缓存中读了同一缓存行到他们内部的高速缓存中,当有一个CPU或核修改了缓存行中的数据,由于缓存一致性协议,会把新的数值写会到内存中,并且其他CPU或者核会把这个数据标记为失效转态,会重新从内存中读取。这样当我们想操作一个数据m的时候,就可以在这个数据m前后多创建几个对象,确保其他线程要操作数据n不在m所在的缓存行中,避免当大量修改m值得时候,其他线程需要反复去内存中重新读取这个缓存行。

如何实现缓存一致性

  1. 使用缓存锁(MESI): 用四种标记每个cache line的状态。有时有些无法缓存的数据或者跨越多个缓存行的数据用总线锁)
  2. 使用总线锁

CPU指令并写

当有多个指令进行写操作时,可以把这些指令先做完再写回内存。

当进行并写时,会把指令完成后的结果存入到一个WriteCombingBuffer,它类似于一个数组,但只有4个位置,并且它的速度比高速缓存还要快。当里面4个位置都被装满后就会写回L2。

硬件、内存级别如何实现内存屏障

sfence指令:表示执行sfence指令之前的写操作一定要在sfence指令之后的写操作之前完成。

lfence指令:同理

mfence指令

JVM级别中的规范

  1. LoadLoad屏障

    对于 Load1; LoadLoad; Load2这样的语句

    要保证Load2读取之前,Load1已读取完毕。

  2. LoadStore屏障

    同理

  3. StoreLoad屏障

  4. StoreStore屏障

volatile实现细节

  1. 字节码层面

    在Access flags中会标记为 volatitle

  2. JVM层面

    在对Volatitle内存区进行读写时,都加屏障

    StoreStore 屏障

    Volatitle写操作

    StoreLoad 屏障

    LoadLoad 屏障

    Volatitle 读操作

    LoadStore 屏障

  3. OS和硬件层面

    lock指令

Synchronized实现细节

  1. 字节码层面

    1. 如果写在方法上 Access flags 会标记这个方法为 synchronized

    2. 如果写在代码块上,会用两个指令实现

      monitorenter moniterexit

  2. JVM层面

    会调用C/C++写的调用操作系统的同步机制

  3. OS和硬件层面

    X86中: lock comxchg ...

参考:

https://blog.csdn.net/21aspnet/article/details/88571740

https://blog.csdn.net/qq_26222859/article/details/52235930

关于Java中的内存屏障的更多相关文章

  1. Java中堆内存和栈内存详解2

    Java中堆内存和栈内存详解   Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,ja ...

  2. 关于Hash集合以及Java中的内存泄漏

    <学习笔记>关于Hash集合以及Java中的内存泄漏 标签: 学习笔记内存泄露hash 2015-10-11 21:26 58人阅读 评论(0) 收藏 举报  分类: 学习笔记(5)  版 ...

  3. java中的内存一般分成几部分?

    java中的内存被分成以下四部分: ①.代码区  ②.栈区  ③.堆区   ④.静态区域 栈区:由编译器自动分配释放,存放函数的参数值.局部变量的值等:具体方法执行结束后,系统自动释放JVM内存资源 ...

  4. java中的内存溢出和内存泄漏

    内存溢出:对于整个应用程序来说,JVM内存空间,已经没有多余的空间分配给新的对象.所以就发生内存溢出. 内存泄露:在应用的整个生命周期内,某个对象一直存在,且对象占用的内存空间越来越大,最终导致JVM ...

  5. Java SE之Java中堆内存和栈内存[转/摘]

    [转/摘]1-3Java中堆内存和栈内存 注解:内存(Memory)即 内存储器,主存,其作用是用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器(辅存)交换的数据. Java中把内存分为两种:栈 ...

  6. Java基础-Java中的内存分配与回收机制

    Java基础-Java中的内存分配与回收机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一. 二.

  7. Java中的内存处理机制和final、static、final static总结

    Java中的内存处理机制和final.static.final static总结   装载自:http://blog.csdn.net/wqthaha/article/details/20923579 ...

  8. Java中关于内存泄漏出现的原因以及如何避免内存泄漏

    转账自:http://blog.csdn.net/wtt945482445/article/details/52483944 Java 内存分配策略 Java 程序运行时的内存分配策略有三种,分别是静 ...

  9. Java中的内存泄漏

    [转]介绍Java中的内存泄漏 1. 什么是内存泄漏? 内存泄漏的定义:对象已经没有被应用程序使用,但是垃圾回收器没办法移除它们,因为还在被引用着. 要想理解这个定义,我们需要先了解一下对象在内存中的 ...

随机推荐

  1. 阿里云ECS磁盘扩容不生效处理办法

    原因 阿里云ECS云盘扩容后,在Linux服务器上没有生效 实际需要几条命令扩容才能正式生效. 处理方法 先看扩容前磁盘空间,/dev/vda1可以看到只有40G. # df -Th Filesyst ...

  2. 【Flutter 混合开发】与原生通信-EventChannel

    Flutter 混合开发系列 包含如下: 嵌入原生View-Android 嵌入原生View-iOS 与原生通信-MethodChannel 与原生通信-BasicMessageChannel 与原生 ...

  3. 硬核!15张图解Redis为什么这么快

    作为一名服务端工程师,工作中你肯定和 Redis 打过交道.Redis 为什么快,这点想必你也知道,至少为了面试也做过准备.很多人知道 Redis 快仅仅因为它是基于内存实现的,对于其它原因倒是模棱两 ...

  4. 走在深夜的小码农 Third Day

    Css3 Third Day writer:late at night codepeasant css简介 ​ CSS 是层叠样式表 ( Cascading Style Sheets ) 的简称.​ ...

  5. 简单粗暴套娃模式组json发送https请求

    各位童鞋大家好,向来简单粗暴的铁柱兄给大家来玩一手套娃模式来组Json数据,不说别的,无脑套. 当然,这一手比较适合临场用一下,若长期用的话建议搞一套适用的框架,只管set就好了.话不多说开始上课. ...

  6. LWJGL3的内存管理,第一篇,基础知识

    LWJGL3的内存管理,第一篇,基础知识 为了讨论LWJGL在内存分配方面的设计,我将会分为数篇随笔分开介绍,本篇将主要介绍一些大方向的问题和一些必备的知识. 何为"绑定(binding)& ...

  7. MySQL各版本connector net msi

    从其他博主那里扒来的! 链接:https://pan.baidu.com/s/1C1fYepBFKfxU0NJS0aRyJw 提取码:awsl

  8. Javasript中this指向问题和改变this指向的方法

    在学习javascript中我们往往会被this的指向问题弄的头昏转向,今天我们就来学习一下this的指向问题,和改变this指向的方法. 一.this的指向问题 在学习this的指向问题之前我们需要 ...

  9. C语言中宏的作用

    在C语言#define机制中包括了一个规定,与允许把参数替换到文本中,这种实现通常称为宏或宏定义.下面是宏的声明方式: #define      name(parameter-list)       ...

  10. 谈谈synchronized

    为什么要用synchronized关键字: synchronized是java的一种内部锁,是一种排他锁,通常也被称为悲观锁,它能够保障原子性,可见性,有序性. 当多个线程去调用同一个方法的时候,如果 ...