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. CentOS 6.7快速搭建lamp环境
  2. 智源研究院联合多家权威机构上线“新冠肺炎(COVID-19)开放数据源”,打造全面、精细的新冠数据平台...
  3. 5G 信令流程 — UE 状态机
  4. java 中static 关键字的用法全解
  5. 推荐系统User-Item Embedding图算法
  6. 关于iframe的contentDocument和contentWindow
  7. 关于ECLIPSE中JSP代码无提示
  8. python string length_自学Python:第四篇字符串
  9. HTML-DOM零碎
  10. linux中程序定时重启脚本,linux下通过脚本实现自动重启程序的方法
  11. Android注解编程的第一步---模仿ButterKnife的ViewBinder机制
  12. html字段集,禁用HTML DOM字段集的属性
  13. codeblocks下载
  14. java 程序计数器_JVM入门系列之程序计数器
  15. 【python学习】python实现利用pygame绘画基本图形、显示图片,实现图形图片随机效果。python绘制行列图片
  16. CentOS7--安装谷歌浏览器--详细步骤
  17. 鼠标回报率测试软件用哪个,揭开鼠标的秘密 艾尚教你如何测回报率
  18. java-net-php-python-JSP学校教育论坛管理系统开题任务书PPT计算机毕业设计程序
  19. oppor829t如何刷机_oppo R829t (R1 移动版)一键救砖教程,轻松刷回官方系统
  20. 判断和推论_数据科学的假设和推论

热门文章

  1. Python实现王者荣耀小助手(二)
  2. macos 菜单栏 oc_如何启用macOS的深色菜单栏和Dock
  3. (纯故事)我简单写几篇,就这一次
  4. 哈哈日语 五十音图之あ段音
  5. VS2015问题:stack around the variable “XX” was corrupte
  6. 【CODEVS 3287】【NOIP2013】火车运输
  7. patch 和put的区别
  8. 计算机网络实验报告三
  9. 在一次班会课上的讲话
  10. 教大家如何用一行代码打造下载神器!下载全网视频、音频、图像!太牛了!