Java底层篇(1.3)

  • 1、JVM
    • → Java 内存模型
      • 计算机内存模型、缓存一致性、MESI 协议
      • 可见性、原子性、有序性、happens-before、
    • → JVM 参数及调优
      • -Xmx、-Xmn、-Xms、Xss、-XX:SurvivorRatio、
      • -XX:PermSize、-XX:MaxPermSize、-XX:MaxTenuringThreshold

1、JVM

→ Java 内存模型

计算机内存模型、缓存一致性、MESI 协议

计算机内存模型:
之前文章已经总结过。

CPU与缓存一致性
随着CPU的技术发展,CPU执行速度越来越快,但是内存技术并没有太大的变化,导致CPU操作内存都要耗费很多时间。所以在CPU和内存之间增加高速缓存。

那么,当程序在运行过程中,会将运算需要的数据从主存复制一分到CPU的高速缓存中,那么CPU在计算时就可以直接从他的高速缓存中读取和向其中写入数据,当运算结束后,再将高速缓存中的数据刷到主存当中。
而随着CPU能力的不断提升,一层缓存就慢慢的无法满足要求了,就逐渐的衍生出多级缓存。

MESI 协议
多核CPU的情况下有多个一级缓存,如何保证缓存内部数据的一致,不让系统数据混乱。这里就引出了一个一致性的协议MESI。

MESI 是指4种状态的首字母。每个Cache line有4个状态,可用2个bit表示,它们分别是:

状态 描述 监听任务
M 修改 (Modified) 该Cache line有效,数据被修改了,和内存中的数据不一致,数据只存在于本Cache中。 缓存行必须时刻监听所有试图读该缓存行相对就主存的操作,这种操作必须在缓存将该缓存行写回主存并将状态变成S(共享)状态之前被延迟执行。
E 独享、互斥 (Exclusive) 该Cache line有效,数据和内存中的数据一致,数据只存在于本Cache中。 缓存行也必须监听其它缓存读主存中该缓存行的操作,一旦有这种操作,该缓存行需要变成S(共享)状态。
S 共享 (Shared) 该Cache line有效,数据和内存中的数据一致,数据存在于很多Cache中。 缓存行也必须监听其它缓存使该缓存行无效或者独享该缓存行的请求,并将该缓存行变成无效(Invalid)。
I 无效 (Invalid) 该Cache line无效。

注意:
对于M和E状态而言总是精确的,他们在和该缓存行的真正状态是一致的,而S状态可能是非一致的。如果一个缓存将处于S状态的缓存行作废了,而另一个缓存实际上可能已经独享了该缓存行,但是该缓存却不会将该缓存行升迁为E状态,这是因为其它缓存不会广播他们作废掉该缓存行的通知,同样由于缓存并没有保存该缓存行的copy的数量,因此(即使有这种通知)也没有办法确定自己是否已经独享了该缓存行。

从上面的意义看来E状态是一种投机性的优化:如果一个CPU想修改一个处于S状态的缓存行,总线事务需要将所有该缓存行的copy变成invalid状态,而修改E状态的缓存不需要使用总线事务。

MESI状态转换

【参考链接】https://www.hollischuang.com/archives/2550
https://www.cnblogs.com/yanlong300/p/8986041.html

可见性、原子性、有序性、happens-before、

可见性:多个线程同时访问一个变量时,一个线程修改了这个变量的值,其他线程能够立即看到修改后的值。
原子性:指原子性的操作是不可中断的,要么全部执行,要么全部不执行。
线程是CPU调度的基本单位,CPU有时间片的概念,根据不同的调度算法调度线程,一个线程获取时间片后开始执行,多线程情况下,容易发生原子性问题。
有序性:有序性即执行程序的顺序按照代码的先后顺序执行。
happens-before:这个原则会保证在发生指令重排情况下,程序还保证有序性,其原则在 Java基础篇(6)中写到过。其规则包含程序次序规则、监视器锁规则、volatile域规则、传递规则、线程规则等。

→ JVM 参数及调优

-Xmx、-Xmn、-Xms、Xss、-XX:SurvivorRatio、

-Xmx:堆内存的最大大小,默认为物理内存的1/4
-Xmn:堆内新生代的大小,通过这个值可以得到老生代的大小:-Xmx减去-Xmn
-Xms:堆内存的最小大小,默认为物理内存的1/64
-Xss:设置每个线程可使用的内存大小,即栈的大小。在相同物理内存下,减小这个值能生成更多的线程,当然操作系统对一个进程内的线程数还是有限制的,不能无限生成。如果设置过小,可能会出现栈溢出,特别是在该线程内有递归、大的循环时出现溢出的可能性更大,如果该值设置过大,就有影响到创建栈的数量,如果是多线程的应用,就会出现内存溢出的错误。
-XX:NewRatio:设置新生代和老年代的比值。如:为3,表示年轻代与老年代比值为1:3
-XX:SurvivorRatio:新生代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:为3,表示Eden:Survivor=3:2,一个Survivor区占整个新生代的1/5

-XX:PermSize、-XX:MaxPermSize、-XX:MaxTenuringThreshold

-XX:PermSize、-XX:MaxPermSize:分别设置永久代最小大小与最大大小(Java8以前)
-XX:MetaspaceSize、-XX:MaxMetaspaceSize:分别设置元空间最小大小与最大大小(Java8以后)
-XX:MaxTenuringThreshold:设置转入老年代的存活次数。如果是0,则直接跳过新生代进入老年代

【参考链接】https://blog.csdn.net/yrwan95/article/details/82826519

旷野徒奔-Java底层篇(1.3)相关推荐

  1. 旷野徒奔-Java底层篇(1.4)

    Java底层篇(1.4) 1.JVM → Java 对象模型 oop-klass.对象头 → HotSpot 即时编译器.编译优化 → 虚拟机性能监控与故障处理工具 jps, jstack, jmap ...

  2. Java总结篇系列:Java多线程(三)

    2019独角兽企业重金招聘Python工程师标准>>> 本文主要接着前面多线程的两篇文章总结Java多线程中的线程安全问题. 一.一个典型的Java线程安全例子 public cla ...

  3. java提高篇之数组(2)

    前面一节主要介绍了数组的基本概念,对什么是数组稍微深入了一点点,在这篇博文中主要介绍数组的其他方面. 三.性能?请优先考虑数组 在java中有很多方式来存储一系列数据,而且在操作上面比数组方便的多?但 ...

  4. Java集合篇:Map总结

    相关阅读: Java基础篇:hashCode的作用 Java集合篇:HashMap原理详解(JDK1.7及之前的版本) Java集合篇:HashMap原理详解(JDK1.8) Java集合篇:Hash ...

  5. Java基础篇:封装、继承、多态三大特性

    目录: 一.Java三大特性之:封装 二.Java三大特性之:继承 三.Java三大特性之:多态 一.Java三大特性之:封装 1.什么是封装: 封装,就是将数据和基于数据的操作封装在一起,数据被保护 ...

  6. 【转】java提高篇(二)-----理解java的三大特性之继承

    [转]java提高篇(二)-----理解java的三大特性之继承 原文地址:http://www.cnblogs.com/chenssy/p/3354884.html 在<Think in ja ...

  7. Java提高篇 —— Java三大特性之继承

    一.前言 在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事 ...

  8. JAVA分布式篇3——Dubbo

    JAVA分布式篇3--Dubbo 1.架构演变 1.1.单应用架构 当网站流量很小时,只需要一个应用,将所有的功能部署到一起(所有业务都放在一个tomcat 里),从而减少部署节点和成本 用于简化 增 ...

  9. Java SSM篇2——框架的基本认识

    Java SSM篇2--框架的基本认识 1.什么是框架 框架就是一套规范,既然是规范,你使用这个框架就要遵守这个框架所规定的约束 框架可以理解为半成品软件,框架做好以后,接下来在它基础上进行开发 2. ...

最新文章

  1. jboss1.7_快速指南:剖析JBoss BPM跨进程通信
  2. php pdf 加密 签名 时间戳,在现有PDF签名上添加签名时间戳
  3. SAP成都研究院C4C光明左使:SAP Cloud for Customer 使用SAP UI5的独特之处
  4. oracle ebs hr模块表,oracle ebs常用表结构及分类模块.doc
  5. 常用MySQ调优策略及相关分享:学习随记
  6. 相对路径 ‘’,‘/’,‘./‘,‘../‘
  7. 【慢慢学Android】:11.对话框大全
  8. php神盾 var 1.54,神盾加密解密教程(一)PHP变量可用字符
  9. Bash中命令连接符的用法——一次执行多个命令-转
  10. wpf之样式属性、事件、触发器
  11. c语言程序员表白代码6,520到了——程序员表白代码大全公开!
  12. 2018科大讯飞营销广告算法大赛
  13. gcc用-O0优化无问题,-O3优化时程序崩溃的问题
  14. 从 Google 离职了!
  15. 腾讯AlloyTeam招募Web工程师(社招/校招/实习生)
  16. 矩阵内积、外积(克罗内克积)和Hadamard积
  17. 混乱是怎样炼成的——《C解毒》试读
  18. 认识css长度单位 px % em rem vh vw
  19. hdu 1907 & hdu 2509(Nim博弈)
  20. 实验:ospf与BFD联动实验(EVE模拟器-Cisco)

热门文章

  1. 51Nod3236-第k小生成数
  2. 《数据库原理》实验 西北工业大学
  3. SSM集成支付宝(沙箱环境)
  4. 2014上海全国邀请赛题解 HDOJ 5090-5099
  5. C#同步数据库的数据到Neo4J
  6. n个企业的古诺模型中的纳什均衡
  7. Python学习笔记 print()函数输出多个变量 使用.format()
  8. 轮播图功能的全实现(自动播放、小点点、按住停止播放、放手后开始播放...)
  9. 实时曲线 温湿度表_温湿度表
  10. [AHK]Windows10中如何只通过键盘就将窗口移动到其他虚拟桌面?