JVM学习--数字存储,内存模型,指令重排

一、数字在计算机中如何存储

  整数:以补码形式存储。

    补码:正数的补码是自身,负数的补码是取反码加1(取反码时符号位还是1)

  浮点型:以float类型表示

  

    注意一下,这八位指数实际上是(127+次数)的结果,因为要考虑到负数指数的情况,例如如下120.5在计算机中的存储:

    

    而因为科学计数法第一位总是1开头,可以将小数点前面的1省略,所以23bit的尾数部分,可以表示的精度却变成了24bit。那24bit能精确到小数点后几位呢,我们知道9的二进制表示为1001,所以4bit能精确十进制中的1位小数点,24bit就能使float能精确到小数点后6位。那从这里可以看到,如果小数位数过多,是不能被精确存储的,还有另一种情况不能被精确存储,例如小数0.2,在取二进制的过程中,“乘2取整,顺序排列”,那最终也乘不到一个整数,所以也是不能被精确存储的。

二、JVM基本结构--内存模型

  这里不说方法区、堆栈之类的,等总结到gc的时候再好好说。

  

  这里只看这张图能反应出的东西:

    ① 每一个线程都有一个独立工作内存(寄存器)

    ② 工作内存中存放的是主存中变量的值的拷贝

    那我们可以发现,当一个线程修改了一个共享变量并写回主存时,另一个持有此共享变量的线程并不会立刻得知此变化,因为这个线程操作的是自己工作内存里的变量,这就是可见性问题(volatile,synchronized,final)。

    之前写的博客:http://www.cnblogs.com/NoYone/p/8541898.html

三、基本结构--指令重排

  指令重排能帮助程序更快速的运行,这是jvm做的优化,但有些时候程序必须顺序执行,指令重排符合以下规则。

  

原文地址:https://www.cnblogs.com/NoYone/p/8969818.html

时间: 2024-10-11 04:01:01

JVM学习--数字存储,内存模型,指令重排的相关文章

JVM学习记录-Java内存模型(二)

对于volatile型变量的特殊规则 关键字volatile可以说是Java虚拟机提供的最轻量级的同步机制. 在处理多线程数据竞争问题时,不仅仅是可以使用synchronized关键字来实现,使用volatile也可以实现. Java内存模型对volatitle专门定义了一些特殊的访问规则,当一个变量被定义为volatile时,它将具备以下两个特性: 第一个是保证此变量对所有线程的可见性,这里的“可见性”是指当一条线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的.而普通变量不能做到这

深入理解Java虚拟机(jvm性能调优+内存模型+虚拟机原理)视频教程

14套java精品高级架构课,缓存架构,深入Jvm虚拟机,全文检索Elasticsearch,Dubbo分布式Restful 服务,并发原理编程,SpringBoot,SpringCloud,RocketMQ中间件,Mysql分布式集群,服务架构,运 维架构视频教程 14套精品课程介绍: 1.14套精 品是最新整理的课程,都是当下最火的技术,最火的课程,也是全网课程的精品: 2.14套资 源包含:全套完整高清视频.完整源码.配套文档: 3.知识也 是需要投资的,有投入才会有产出(保证投入产出比是

深入理解Java虚拟机- 学习笔记 - Java内存模型与线程

除了在硬件上增加告诉缓存之外,为了使得处理器内部的运算单元能尽量被充分利用,处理器可能会对输入代码进行乱序执行(Out-Of-Order Execution)优化,处理器会在计算之后将乱序执行的结果重组,保证该结果与顺序执行的结果一致,但并不保证程序中各个语句计算的先后顺序与输入代码中的顺序一致,因此,如果存在一个计算任务依赖另外一个计算任务的中间结果,那么其顺序性并不能靠代码的先后顺序来保证.与处理器的乱序优化执行类似,Java虚拟机的即时编译器中也有类似的指令重排序(Instruction

JavaScript学习系列之内存模型篇

一个热爱技术的菜鸟...用点滴的积累铸就明日的达人 正文 如果真的想学好一门语言,那么一定要了解它内存模型,本篇文章就带你走进JavaScript的内存模型,由于本人才疏学浅,若有什么表述有误的地方,欢迎各位看官能够指点一二,在此不胜感激... 在阅读这边文章之前,默认您已经掌握了JavaScript的基本概念.栈堆等基本数据结构以及计算机基本理论基础,如有了解欠缺,请移步相关博客后再阅读本文. 一.基本的数据类型的内存结构 首先粗略的介绍一下JavaScript中五种基本的数据类型Undefi

Jvm学习笔记-Java内存管理(一)

运行时数据区 java程序员吧内存控制的权利交给了虚拟机完成,一旦出现内存溢出或泄露,如果不了解虚拟机是怎样使用内存的,那么排查错误将非常艰难. JVM在执行Java程序时会把所管理的内存分为若干个不同的数据区,粗略可以分为两类,线程隔离和非线程隔离.具体细分可见下图                       (1)程序计数器 是一块较小的内存空间,可看做当前线程所执行的字节码的行号指示器.Java的多线程通过线程的轮流切换来实现,为了线程切换后能恢复到正确的执行位置,每条线         

JVM系列(一内存模型)

好久没有整理这方面的东西了.现在整理一下JVM相关的东西.这是第一篇,JVM内存模型. 进程&JVM 首先,何谓JVM?为什么要有JVM的存在? JVM就是java virtual machine的简称.当然了,除了java的VM以外还会有好多别的虚拟机.java的VM模型有好几个,其中最常见的应该是HotSpot VM. 假设jvm在一个32位的操作系统中运行.32位windows最大只支持4G内存,而进程只能最多2G内存:32位linux最大也只支持4G内存,但是进程最多可以有3G左右.画个

JVM学习记录1--JVM内存布局

先上个图 这是根据<Java虚拟机规范(第二版)>所画的jvm内存模型. 程序计数器:程序计数器是用来记录当前线程方法执行顺序的,对应的就是我们编程中一行行代码的执行顺序,如分支,跳转,循环,异常处理等.所以在多线程下,程序计数器必然是线程隔离的,每个线程都有自己独立的程序计数器.注意,Java虚拟机中的程序计数器指向正在执行的字节码地址. 本地方法栈:本地方法栈时用来保存本地方法,即jvm调用外部的方法,比如操作系统本身的方法,或者自定义的c方法,这类方法都带有native关键字.这类又被成

JVM相关之JVM运行参数和内存模型

Jvm优化 了解下我们为什么要学习 JVM优化 掌握 jvm的运行参数以及参数的设置 掌握 jvm的内存模型(堆内存) 掌握 jamp命令的使用以及通过MAT工具进行分析 掌握定位分析内存溢出的方法 为什么要学习JVM优化 JVM被称为Java虚拟机,所有Java程序的运行都依赖于JVM 1.应用运行一段时间后突然停止,程序没有响应 2.服务器的CPU突然升高 3.在多线程应用下,如何去分配线程数量 ....................... 优化JVM目的是为了让程序运行的更快 JVM运行

第16章.Java内存模型

假设一个线程为变量赋值:variable = 3: 内存模型需要解决一个问题:“在什么条件下,读取variable的线程将看到这个值为3?” 这看上去理所当然,但是如果缺少同步,那么将会有许多因素使得线程无法立即甚至永远,看到另一个线程的操作结果.如: 1.在编译器中生成的指令顺序,可以与源代码中的顺序不同,此外编译器还会将变量保存在寄存器而不是内存中: 2.处理器可以采用乱序或并行等方式来执行指令: 3.缓存可能会改变将写入变量提交到主内存的次序: 4.而且保存在处理器本地缓存中的值,对于其他