1. 程式人生 > >JVM學習--數字存儲,內存模型,指令重排

JVM學習--數字存儲,內存模型,指令重排

順序 如何 zed png 小數位 image 每一個 tile 運行

一、數字在計算機中如何存儲

  整數:以補碼形式存儲。

    補碼:正數的補碼是自身,負數的補碼是取反碼加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做的優化,但有些時候程序必須順序執行,指令重排符合以下規則。

  技術分享圖片

JVM學習--數字存儲,內存模型,指令重排