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

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

  整数:以补码形式存储。

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

  浮点型:以float类型表示

  

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

    

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

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

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

  

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

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

扫描二维码关注公众号,回复: 87700 查看本文章

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

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

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

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

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

  

猜你喜欢

转载自www.cnblogs.com/NoYone/p/8969818.html