zoukankan      html  css  js  c++  java
  • 初识JVM

            做了这么久的开发,到目前为止对JVM也只是一些简单的概念上的理解,正好周末于是将JVM的学习提上日程。

    JVM 概念

            JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
            一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java的能够“一次编译,到处运行”的原因。(摘录自百度百科)

    JVM 规范

    JVM 规范主要定义了二进制 class 文件 和 JVM 指令集等

    - class 文件类型

    - 运行时数据

    - 帧栈

    - 虚拟机的启动

    - 虚拟机的指令集

    • 类型转化(l2i)
    • 出入栈操作(aload astore)
    • 运算(iadd isub)
    • 流程控制(ifeq ifne)
    • 函数调用(invokevirtual invokeinteeerface invokespespecial invokestatic)

    - 整数的表达

    • 源码:第一位为符号位(0为正数,1为负数)
        7
        原码:00000111
    • 反码:符号位不动,原码区反
        6
        原码:00000110
        反码:01111001
    • 负数补码:符号位不动,反码加1
        -5
        原码:10000101
        反码:11111010
        补码:11111011
    • 正数补码:和原码相同
        5
        原码:00000101
        反码:01111010
        补码:00000101
    • 打印整数二进制
    int a = 6;
    for(int i = 0; i < 32; i++){
        int t = (a & 80000000 >>>i) >>> (31 - i);
        System.out.print(t);
    }
    第一次循环:
    0000 0000 0000 0000 0000 0000 0000 0110 (6的原码)
    1000 0000 0000 0000 0000 0000 0000 0000 (80000000 >>> 0 的值)
    0000 0000 0000 0000 0000 0000 0000 0000 (6 & 80000000 >>> 0)
    0000 0000 0000 0000 0000 0000 0000 0000 (上面结果向右位移31位的值)
    第二次循环:
    0000 0000 0000 0000 0000 0000 0000 0110 (6的原码)
    0100 0000 0000 0000 0000 0000 0000 0000 (80000000 >>> 1 的值)
    0000 0000 0000 0000 0000 0000 0000 0000 (6 & 80000000 >>> 1)
    0000 0000 0000 0000 0000 0000 0000 0000 (上面结果向右位移30位的值)
                          .
                          .
                          .
    第三十次循环:
    0000 0000 0000 0000 0000 0000 0000 0110 (6的原码)
    0000 0000 0000 0000 0000 0000 0000 0100 (80000000 >>> 29 的值)
    0000 0000 0000 0000 0000 0000 0000 0100 (6 & 80000000 >>> 29)
    0000 0000 0000 0000 0000 0000 0000 0001 (上面结果向右位移2位的值)
    第三十一次循环:
    0000 0000 0000 0000 0000 0000 0000 0110 (6的原码)
    0000 0000 0000 0000 0000 0000 0000 0010 (80000000 >>> 30 的值)
    0000 0000 0000 0000 0000 0000 0000 0010 (6 & 80000000 >>> 30)
    0000 0000 0000 0000 0000 0000 0000 0001 (上面结果向右位移1位的值)
    第三十二次循环:
    0000 0000 0000 0000 0000 0000 0000 0110 (6的原码)
    0000 0000 0000 0000 0000 0000 0000 0001 (80000000 >>> 31 的值)
    0000 0000 0000 0000 0000 0000 0000 0000 (6 & 80000000 >>> 31)
    0000 0000 0000 0000 0000 0000 0000 0000 (上面结果向右位移0位的值)

    因为int值为32位,所以上述计算均为32位码计算,最后将每次循环所得的数打印连接就是6的二进制码

    - 为什么要使用补码

    • 补码可以直接参与加法运算,符号位也可以直接参与运算,最后计算结果为正数则符号位是可以被进位进掉的
    计算:-6+5=-1
    11111010
    00000101
    11111111(-1的补码)

    计算:-4+5=1
    11111100
    00000101
    00000001
    • 表示0
      因为0既不是正数也不是负数,那么我们在计算机中怎么表示0呢?
    0
    正数表示:00000000
    负数表示:10000000
    正数补码:00000000
    负数补码:00000000

    结果发现0不论是表示为正数还是负数它的补码都是00000000

    - 浮点数的表示

    一个浮点数 (Value) 的表示其实可以这样表示:
    也就是浮点数的实际值,等于符号位(sign bit)乘以指数偏移值(exponent bias)再乘以分数值(fraction)。
    对于不同长度的浮点数,阶码与小数位分配的数量不一样,如下:

    类型数符阶码尾数总位数偏移值
    短实数 1 8 23 32 127
    长实数 1 11 52 64 1023
    零时实数 1 15 64 80 16383
    • 我们对单精度浮点数为例,数符分配是1位,阶码分配了8位,尾数分配了是23位
    • 例如: -5.125
    符号位:1
    整数部分:00000101(除2求余法)
    小数部分:001(乘2求整法)
    整体则为:00000101.001
    转化二进制浮点数,使得整数未为1   1.01001 * 10   10为二进制2,表示小数点位移2位
    阶码:单精度的浮点数阶码为8,偏移值为01111111  则 10 + 01111111 = 10000001
    尾数:01001
    则二进制码为: 1 10000001 01001000000000000000000(数符 阶码 尾数)

    - JVM 需要对java Library 提供以下支持

    • 反射 java.lang.reflect
    • ClassLoader
    • 初始化 class 和 interface
    • 安全相关 java.security
    • 多线程
    • 弱引用

    - JVM的编译

    • 原码到JVM指令的对应格式
    • javap
    • JVM 反汇编格式
    <index><opcode>[<operand1>[operand2]][<commend>]

    for(i = 0; i 100; i++){
    }

    上述代码对应的汇编语言为:

    0 iconst_0     //Push int constant 0
    1 istore_1     //Store into local variavle 1 (i=0)
    goto 8       //Fist time through don`t increment
    5 iinc 1     //Increment local variable 1 by 1(i++)
    8 iload_1      //Push local variable 1 (i)
    9 bipush 100   //Push int constant 100
    11 if_icmplt //Compare and loop if less than (i<100)
    14 return      //Return void when done


    今天也算是对jvm有一个初步的了解,后续将对jvm有一个更深层次的学习,如果有什么不对的地方希望各位大佬及时指正。

    -------------------- END ---------------------

     

    最后附上作者的微信公众号地址和博客地址 

    公众号:wuyouxin_gzh

     

    Herrt灬凌夜:https://www.cnblogs.com/wuyx/

     
  • 相关阅读:
    asp.net MVC 3/4 equivalent to a response.filter
    Asp.net MVC Request Life Cycle
    无法完成你的itunes store 请求发生未知错误50
    苹果Mac OS X系统十三年视觉变化发展史
    authentication not supported Connect to TFS Git from Xamarin Studio (non-hosted, locally installed TFS 2013)
    iOS开发者帐号申请指南
    Apple Developer Registration and DUNS Number Not Accepted
    apple developer D-U-N-S® Number
    苹果企业开发者账号申请记录
    D-U-N-S申请流程
  • 原文地址:https://www.cnblogs.com/wuyx/p/9609839.html
Copyright © 2011-2022 走看看