如何打破双亲委派机制

继承ClassLoader类后重写loadClass方法

如何指定自定义ClassLoader中的parent

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

存储器的层器结构

为什么要缓存行对齐

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

如何实现缓存一致性

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

使用总线锁

CPU指令并写

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

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

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

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

lfence指令:同理

mfence指令

JVM级别中的规范

LoadLoad屏障

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

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

LoadStore屏障

同理

StoreLoad屏障

StoreStore屏障

volatile实现细节

字节码层面

在Access flags中会标记为 volatitle

JVM层面

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

StoreStore 屏障

Volatitle写操作

StoreLoad 屏障

LoadLoad 屏障

Volatitle 读操作

LoadStore 屏障

OS和硬件层面

lock指令

Synchronized实现细节

字节码层面

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

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

monitorenter moniterexit

JVM层面

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

OS和硬件层面

X86中: lock comxchg ...

参考:

java 内存屏障_关于Java中的内存屏障相关推荐

  1. java递归优化_在Java中谈尾递归--尾递归和垃圾回收的比较

    我不是故意在JAVA中谈尾递归的,因为在JAVA中谈尾递归真的是要绕好几个弯,只是我确实只有JAVA学得比较好,虽然确实C是在学校学过还考了90+,真学得没自学的JAVA好 不过也是因为要绕几个弯,所 ...

  2. C++中运行一个程序的内存分配情况及qt中的内存管理机制

    一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 2.堆区(heap) - 一 ...

  3. Java指令屏障_指令重排序和内存屏障

    sap hana计算技术项目实战指南内存 61元 (需用券) 去购买 > 一.指令重排序 指令重排序分为三种,分别为编译器优化重排序.指令级并行重排序.内存系统重排序.如图所示,后面两种为处理器 ...

  4. jni jvm 内存泄漏_解析Java的JNI编程中的对象引用与内存泄漏问题

    JNI,Java Native Interface,是 native code 的编程接口.JNI 使 Java 代码程序可以与 native code 交互--在 Java 程序中调用 native ...

  5. java内存漏洞_处理Java程序中的内存漏洞

    Java 程序中也有内存漏洞?当然有.与流行的观念相反,在 Java 编程中,内存治理仍然是需要考虑的问题.在本文中,您将了解到什么会导致内存漏洞以及何时应该关注这些漏洞.您还有机会实践一下在您自己的 ...

  6. java 二维数组内存溢出_模拟Java内存溢出

    本文通过修改虚拟机启动参数,来剖析常见的java内存溢出异常(基于jdk1.8). 修改虚拟机启动参数 这里我们使用的是IDEA集成开发环境,选择Run/Debug Configurations 然后 ...

  7. java jvm 内存参数_深入详解JVM内存模型与JVM参数详细配置

    对于大多数应用来说,Java 堆(Java Heap)是Java 虚拟机所管理的内存中最大的一块.Java 堆是被所有线程共享的一块内存区域,在虚拟机启动时创建. JVM内存结构 由上图可以清楚的看到 ...

  8. java jvm内存地址_深入Java虚拟机——JVM内存详解

    在C++中,程序员拥有每一个对象的所有权,但与此同时还肩负着释放对象内存空间的责任:而Java由于有了虚拟机的帮助,程序员拥有对象的所有权的同时不再需要释放对象的内存空间.由于是JVM自动进行对象内存 ...

  9. java jmap 分析_利用java虚拟机的工具jmap分析java内存情况

    有时候碰到性能问题,比如一个java application出现out of memory,出现内存泄漏的情况,再去修改bug可能会变得异常复杂,利用工具去分析整个java application 内 ...

  10. java 简化判断_简化Java内存分析

    java 简化判断 作为一名典型的Java开发人员,除了遵循关闭连接,流等典型的最佳实践外,我从未监视过应用程序的内存使用情况.最近,我们在JBoss服务器中遇到了一些问题,不得不深入研究内存管理Ja ...

最新文章

  1. 【opencv】(13) 案例:停车场空余车位检测,附python完整代码
  2. 通过API文档查询Math类的方法,打印出近似圆,只要给定不同半径,圆的大小就会随之发生改变...
  3. Java知识系列 -- 反射
  4. javascript搜索框联想搜索_js实现输入框联想搜索
  5. Excel双样本T检验之成对检验
  6. Qt之QGraphicsView实战篇(很强大)
  7. Kubernetes:通过自动化节省IT预算的4种方法
  8. 单片微型计算机系统应用和开发特点,单片微机原理与应用(第2版)
  9. 程序员输入法_搜狗输入法高级玩法:如何1秒录入30000字
  10. mysql选择前12周_第十二周作业
  11. android+制作开机动画,Android 开机动画制作详解
  12. 计算机专业认识实习目的,计算机专业实习目的与意义
  13. 盘点10种局域网联机游戏
  14. IE浏览器设置默认文档模式
  15. php doctrine,php – Doctrine上的复杂SQL查询
  16. 面试 Redis 没底?这 40 道面试题让你不再慌(附答案)
  17. python爬取虎扑评论_Python爬取NBA虎扑球员数据
  18. python之dict
  19. 一主双从同步错误 error connecting to master ‘slave@192.168.81.158:3306‘ - retry-time: 60 retries: 1
  20. 东软实训推荐面试问题12:三分钟表现自己使我感兴趣就留下来?

热门文章

  1. 18. jQuery - 尺寸
  2. 5. JavaScript RegExp 类型
  3. typeof的用法 typeof的返回值是一个字符串 返回的字符串类别
  4. [2019杭电多校第八场][hdu6667]Roundgod and Milk Tea
  5. 错误、调试和测试(4)-文档测试
  6. Sequence of methods in form and table in AX
  7. 留存: struts2+jquery+json集成
  8. 广播的接收与U盘广播
  9. MySql BlackHole存储引擎
  10. Android 如何在一个Activity中合理地显示多种类型的checkBox