做了这么久的开发,到目前为止对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)
2 goto 8       //Fist time through don`t increment
5 iinc 1 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 5 //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/

 

初识JVM的更多相关文章

  1. 初识 JVM

    发展历史 1996年,SUN JDK 1.0 Classic VM 发布,纯解释运行,使用外挂进行JIT 1997年 JDK1.1 发布.包含了:AWT.内部类.JDBC.RMI.反射 1998年 J ...

  2. 初识JVM虚拟机

    前言: Java语言里负责解释执行字节码文件的是Java虚拟机,即JVM——Java Virtual Machine(Java虚拟机). 执行Java程序的两个步骤: 由Java语言编写的程序需要进过 ...

  3. JVM学习笔记之初识JVM(三)

    一.JVM在计算机中的位置 JVM调用操作系统,操作系统调用硬件,硬件反馈信息至操作系统,操作系统反馈信息至JVM 二.JVM的体系结构 JVM在执行过程中对内存的管理分为5个区域: 1.PC寄存器 ...

  4. JVM内核-原理、诊断与优化学习笔记(一):初识JVM

    文章目录 JVM的概念 JVM是Java Virtual Machine的简称.意为Java虚拟机 虚拟机 有哪些虚拟机 VMWare或者Visual Box都是使用软件模拟物理CPU的指令集 JVM ...

  5. 初识JVM:(二)Java的垃圾回收机制详解

    声明:本文主要参考https://www.cnblogs.com/codeobj/p/12021041.html 仅供个人学习.研究之用,请勿用于商业用途,如涉及侵权,请及时反馈,立刻删除. 一.Ja ...

  6. 初识JVM:(一)JVM工作原理和流程

    本文主要参考:http://blog.csdn.net/CSDN_980979768/article/details/47281037?locationNum=7&fps=1 声明:主要用于个 ...

  7. JVM性能优化 (一) 初识JVM

    一.我们为什么要对JVM做优化 在本地开发环境中我们很少会遇到需要对JVM进行优化的需求,但是到了生产环境,我们可能会有下面的需求: 运行的应用"卡住了",日志不输出,程序没有反应 ...

  8. 「入门篇」初识JVM

    记录于 2022-01-02  17:25:12  GhostFace 1. 什么是JVM? 概念 来自百度百科 JVM是 Java Virtual Machine(Java虚拟机)的缩写,JVM是一 ...

  9. 「入门篇」初识JVM (下下) - GC

    垃圾收集主要是针对堆和方法区进行:程序计数器.虚拟机栈和本地方法栈这三个区域属于线程私有的,只存在于> 线程的生命周期内,线程结束之后也会消失,因此不需要对这三个区域进行垃圾回收. GC - J ...

随机推荐

  1. Elasticsearch技术解析与实战(六)Elasticsearch并发

    乐观锁与悲观锁 图示的冲突过程,其实就是es的并发冲突问题,会导致数据不准确 当并发操作es的线程越多,或者读取一份数据,供用户查询和操作的时间越长,在这段时间里,如果数据被其他用户修改,那么我们拿到 ...

  2. c++ poco 使用mysql中文乱码问题

    poco 是c++ 一个比较好的库,现在正在学习使用它,碰到一些问题记录在此. poco版本:poco-1.46-all ,带有数据库的支持模块 操作系统:ubuntu 1.使用poco的MySQL模 ...

  3. cocos2dx学习,转摘一些链接

    cocos2d-x学习笔记09:动作2:持续动作 ccBezierConfig 贝塞尔坐标点是相对的 Box2DTestBed很有意思的demo,可惜自己水平有限针对其实现还是没弄明白,以后有时间多学 ...

  4. imperva agent 的重新注册

    情况是这样 公司搭了一个环境有mysql的数据库并且安装了agent,imperva管理平台上也可以看到agent的注册信息,但是没想到的是有人把我的虚机给还原快照了,而且还没保存..... 这次写个 ...

  5. 【Python学习】csv库

    csv(Comma-Separated Values, 逗号分割值)是存储表格数据的常用文件格式. 它每一行都用一个换行符分隔,列与列之间用逗号分隔. 本地文件 Python的csv库可以非常简单地修 ...

  6. 混合式App开发 Apicloud 官方iPhone X 适配

    iPhone X 适配 由于iPhone X的特殊造型,为了方便开发者对iPhone X进行适配,苹果在iOS 11中引入了Safe Area的概念,引擎也在api对象下添加了safeArea属性和s ...

  7. 62.Unique Paths---dp

    题目链接 题目大意:给一个m*n的方格,从左上角走到右下角,中间无任何障碍,问有多少种走法. 法一:DFS,超时,简单模板深搜,无任何剪枝,结果一半的数据超时.代码如下: public int uni ...

  8. mysql 配置数据库主从同步

    参考:https://www.cnblogs.com/kevingrace/p/6256603.html http://www.51testing.com/html/00/130600-243651. ...

  9. plt-3D打印1

    plt-3D打印 import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D ...

  10. spring源码分析---IOC(1)

    我们都知道spring有2个最重要的概念,IOC(控制反转)和AOP(依赖注入).今天我就分享一下spring源码的IOC. IOC的定义:直观的来说,就是由spring来负责控制对象的生命周期和对象 ...