1. 程式人生 > >3.深入jvm核心-原理、診斷與優化-1.初始jvm

3.深入jvm核心-原理、診斷與優化-1.初始jvm

一、 初始jvm

  1. 有關補碼,簡要闡述補碼的好處。並計算給出 -99, -105, 205 整數的補碼

     答:簡述補碼的好處:
     在人們的計算概念中零是沒有正負之分的,統一0的處理
     統一處理加減法,無需增加減法器操作
     	正數二進位制的補碼等於它本身,負數的二進位制補碼等於取反+1
     -99:
     原碼:11100011
     反碼  :10011100
     補碼  :10011101
     其它的我直接給出補碼了:
     -105:10010111
     205:00000000 11001101
    
  2. 有關浮點數,根據IEEE745,計算11000001000100000000000000000000的單精度浮點的值,並給出計算過程。

     1 符號位      10000010 值是3       00100000000000000000000  值是1.001 
     = -1 * (2^3)*(2^0 + 2^-3)
     = -8*(1+8/1)
     = -8 -1
     = -9
    

    100.2轉成IEEE745 二進位制 拆解分析:

     1、十進位制轉二進位制(32位),整型部分除2取餘,小數部分成2取整。
     	 100.2 = 1100100.0011001100110011001100110
     2、指數格式化(保留一位非零整數)
     	 1.1001000011001100110011001100110*2^6(整數一位為隱藏附加位)
     3、計算8位指數
     	 6+127=133=10000101 (6為第二步的指數)
     4、獲得IEEE745二進位制表示
     		 0      10000101  10010000110011001100110
     	 符號位       指數           尾數
    

    IEEE 754

    原碼,反碼,補碼

    基礎型別(元型別變數之間賦值修改不會相互影響)

    如果是物件引用同一個例項,物件之間賦值修改會相互影響

  3. 寫一個Java程式,將100.2轉成IEEE745 二進位制表示 ,給出程式和結果。

     結果:01000010110010000110011001100110
     程式( 偷懶了)方法一:
     ```
     public static void main(String[] args) {
     		String value=convert(100.2f);
     		System.out.println(value);
     	}
    
     	public static String convert(float num) {
     		int intVal = Float.floatToIntBits(num);
     		return intVal > 0 ? "0" + Integer.toBinaryString(intVal) : Integer
     				.toBinaryString(intVal);
     	}
     ```
    

    (沒偷懶)方法二:

     ```
     package com.tencent.tubemq.example;
    
     import java.util.ArrayList;
     import java.util.HashSet;
     import java.util.List;
     import java.util.Set;
    
     /**
      * description:
      *
      * @author: dawn.he QQ:       905845006
      * @email: [email protected]
      * @email: [email protected]
      * @date: 2019/9/20    3:15 PM
      */
     public class DeadLockDemo {
     	private static String A = "A";
     	private static String B = "B";
    
     	static class Value {
     		int val;
     	}
    
     	static class Test {
     		public static void main(String[] args) throws InterruptedException {
     			new DeadLockDemo().n2(3,3);
     			System.out.println(new DeadLockDemo().floatToIEEE754(100.2f));
     		}
     	}
    
     	/**
     	 * 執行緒死鎖
     	 */
     	private void deadLock() {
     		Thread t1 = new Thread(new Runnable() {
     			@Override
     			public void run() {
     				synchronized (A) {
     					try {
     						Thread.currentThread().sleep(2000);
     					} catch (InterruptedException e) {
     						e.printStackTrace();
     					}
    
     					synchronized (B) {
     						System.out.println("1");
     					}
     				}
     			}
     		});
    
     		Thread t2 = new Thread(new Runnable() {
     			@Override
     			public void run() {
     				synchronized (B) {
     					synchronized (A) {
     						System.out.println("2");
     					}
     				}
     			}
     		});
    
     		t1.start();
     		t2.start();
     	}
    
     	/**
     	 * 單精度浮點數  轉成 IEEE745
     	 * @param strf = 100.2f
     	 * @return String 1-100100-0011001100110011001100110
     	 * @author Monkey
     	 * */
     	/**
     	 * 獲取float的IEEE754儲存格式
     	 */
     	public String floatToIEEE754(float value) {
     		//符號位
     		String sflag = value > 0 ? "0" : "1";
    
     		//整數部分
     		int fz = (int) Math.floor(value);
     		//整數部分二進位制
     		String fzb = Integer.toBinaryString(fz);
     		//小數部分,格式: 0.02
     		String valueStr = String.valueOf(value);
     		String fxStr = "0" + valueStr.substring(valueStr.indexOf("."));
     		float fx = Float.parseFloat(fxStr);
     		//小數部分二進位制
     		String fxb = toBin(fx);
    
     		//指數位
     		String e = Integer.toBinaryString(127 + fzb.length() - 1);
     		//尾數位
     		String m = fzb.substring(1) + fxb;
    
     		String result = sflag + e + m;
    
     		while (result.length() < 32) {
     			result += "0";
     		}
     		if (result.length() > 32) {
     			result = result.substring(0, 32);
     		}
     		return result;
     	}
    
     	private String toBin(float f) {
     		List<Integer> list = new ArrayList<Integer>();
     		Set<Float> set = new HashSet<Float>();
     		int MAX = 24; // 最多8位
    
     		int bits = 0;
     		while (true) {
     			f = calc(f, set, list);
     			bits++;
     			if (f == -1 || bits >= MAX)
     				break;
     		}
     		String result = "";
     		for (Integer i : list) {
     			result += i;
     		}
     		return result;
     	}
    
     	private float calc(float f, Set<Float> set, List<Integer> list) {
     		if (f == 0 || set.contains(f))
     			return -1;
     		float t = f * 2;
     		if (t >= 1) {
     			list.add(1);
     			return t - 1;
     		} else {
     			list.add(0);
     			return t;
     		}
     	}
    
     	/**j 的n次方 */
     	public void n2(int j, int n) {
     		if (j == 0) {
     			j = 2;
     		}
    
     		int k = 0;
     		for (int i = 0; i < n; i++) {
    
     			if (k == 0) {
     				k = 1 * j;
     			} else {
     				k = k * j;
     			}
     		}
     		System.out.println(k);
     	}
     }
     ```