操作数

如何学好JVM征服面试官?一篇Class 类文件结构你还不会吗?

匿名 (未验证) 提交于 2019-12-02 23:49:02
Java 跨平台的基础 各种不同平台的虚拟机与所有平台都统一使用的程序存储格式――字节码(ByteCode)是 构成平台无关性的基石,也是语言无关性的基础。Java 虚拟机不和包括 Java 在内的任何 语言绑定,它只与“Class 文件”这种特定的二进制文件格式所关联,Class 文件中包含了 Java 虚拟机指令集和符号表以及若干其他辅助信息。 Class 类的本质 任何一个 Class 文件都对应着唯一一个类或接口的定义信息,但反过来说,Class 文件实 际上它并不一定以磁盘文件的形式存在。 Class 文件是一组以 8 位字节为基础单位的二进制流。 Class 文件格式 各个数据项目严格按照顺序紧凑地排列在 Class 文件之中,中间没有添加任何分隔符,这 使得整个 Class 文件中存储的内容几乎全部是程序运行的必要数据,没有空隙存在。 Class 文件格式采用一种类似于 C 语言结构体的伪结构来存储数据,这种伪结构中只有两 种数据类型:无符号数和表。 无符号数属于基本的数据类型,以 u1、u2、u4、u8 来分别代表 1 个字节、2 个字节、4 个字节和 8 个字节的无符号数,无符号数可以用来描述数字、索引引用、数量值或者按照 UTF-8 编码构成字符串值。 表是由多个无符号数或者其他表作为数据项构成的复合数据类型,所有表都习惯性地以 “_info”结尾

1.5-计算机执行指令的过程

隐身守侯 提交于 2019-12-02 23:48:40
  执行指令是计算机过程的核心, 理解了指令如何执行呢,也就把握住了计算机运行原理的关键。 在这一节,我们就一起来看这个模型机是如何执行指令的。   现在我们已经有了这样一个模型 而且我们也知道了计算机执行一条指令的主要步骤包括取指、译码、执行、回写。 那我们就像在这个模型机上尝试执行一条计算机的指令。 这里给出了一个例子,我们想执行的这条指令是ADD R0, [6],这样的一个指令格式代表什么含义呢?从外边,我应该能看出来这是一条加法指令。 那么这个加法应该有两个源操作数,其中一个就是通用寄存器R0的内容; 另一个[6],中括号就代表是存储单元的内容。 那么,中括号里面带一个6说明是地址为6的存储单元的内容。 我们把这两个原操作数相加,就可以得到一个运算结果。 那么,在我们这种格式指令当中,默认第一个操作数即是源操作数又是目的操作数。 这个运算结果就会更新到通用寄存器R0中。   现在我们就来看这条指令是如何在模型机上执行的。 假设模型机的当前状态已经有了一些初始值, 我们需要注意的是CPU中的R0 所保存的值是00000011,这等于10进制的3。 而存储单元地址为6的存储单元的内容是00000010, 相当于10进制的2。 那么我们所要做的,就是把这个存储单元的数和R0当中的数相加,最后再放到R0中。 我们还看到PC寄存器也就是指向下一条指令地址的寄存器,保存的值是 0001

JVM内存结构

匿名 (未验证) 提交于 2019-12-02 23:42:01
Java : OSGI 混合语言 JVM google Kotlin Android Scala(Kafka) 多核并行 CPU JDK1.7 Fork/Join JDK1.8 lambda ( ) 丰富语法: JDK5 ( ) JDK7 try-catch-finally try-with-resource 64 64 32 64 32 JVM 4G CMS G1 JDK11 ZGC 10 TB JDK12 JDK13( 2019 9 ) 4TB 16TB Java SE JavaSE Java Java EE Java ME JDK Java JDK JRE JRE JRE Java SE Java Java JVM java JavaSE 运行时数据区域 JVM C++ = + ---- java --- --- Java 线程私有 程序计数器 较小的内存空间,当前线程执行的字节码的行号指示器;各线程之间独立存储,互不影响(面试可能问到为什么需要) Java Natvie Undefined OutOfMemoryError JVM iload_1 第二个 int bipush 将一个 byte isub 栈顶两int型数值相减,并且结果进栈 istore_1 将栈顶int型数值存入第二个局部变量 栈: java JVM StackFilo 虚拟机栈: 异常:

汇编学习1--寄存器学习

匿名 (未验证) 提交于 2019-12-02 23:42:01
最近发现底层原理知识匮乏,故而重故一下汇编, 以便对系统攻防技术有更好的理解 下图是80X86寄存器整体图示: 4个数据寄存器(EAX、EBX、ECX和EDX) 2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) 6个段寄存器(ES、CS、SS、DS、FS和GS) 1个指令指针寄存器(EIP) 1个标志寄存器(EFlags) 作用:寄存器是 中央处理器 内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存 指令 、 数据 和 地址 。在 中央处理器 的控制部件中,包含的寄存器有 指令寄存器 (IR)和 程序计数器 (PC)。在 中央处理器 的算术及逻辑部件中,寄存器有 累加器 (ACC) (来自百科) 下面对各类寄存器进行介绍: 1. 数据寄存器 作用:数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间 寄存器中数据存储: 在内存中时,由于内存单元是字节单元,刚一个字要用2个地址连续的内存单元来存放,字的低位字节存在低地址单元. 0地址单元中存放的字节型数据为20H,0地址单元中存放的字型数据为4E20H,2地址单元中存放的字节型数据为12H,2地址单元中存放的字型数据为0012H 汇编命令: 2.段寄存器 作用 : 段寄存器 是因为对内存的分段管理而设置的。计算机需要对内存分段,以分配给不同的程序使用

1.3-冯·诺依曼结构的小故事

只谈情不闲聊 提交于 2019-12-02 23:40:27
如果一开始就深入到计算机内部的复杂结构中,也许会让人有些迷惘。我们还是用一个轻松愉快的方式来入手。通过一个餐馆的小故事来了解冯诺依曼结构是如何运转的。 冯诺依曼结构的计算机就好比这个餐馆,CPU就是厨房,而主存就是仓库,仓库里的货架就好比主存当中的存储单元,我们为货架的每一格都编上了一个序号,相当于主存当中的地址,货架上存放的物品相当于存储单元当中的内容,主存中会存放着计算机的指令,还有数据,对于这个餐馆来说就是厨师需要执行的任务和做菜所用的原料,那厨房当中承担主要控制任务的就是这位大厨了,它也是控制器,而运算器则是炊具。那我们还需要一些附加的设备。这个厨师记性很不好,他必须要在身边 有一张纸,上面写着下一张任务单的位置,这里这张纸上写了1,厨师就知道我下一张任务单放在仓库的第一格,那么如果把任务单取回来以后还需要放在身边随时的查看所以他还可以有一个放置当天任务单的位置。如果取来了任务单就放在这。那厨师做菜,做完了菜放哪呢,不能直接端着锅冲到仓库去吧。所以他身边操作台上总得放几个盘子,相当于CPU当中我们就称这些盘子为通用寄存器。 用于临时存放计算器的运算结果或者要送到运算器的操作数。我们有可能从主存当中事先会取来一些操作数,当然也需要执行指令去取来一些操作数,先放到通用寄存器当中,那好这个餐馆是如何运转的呢?   我们就让它像计算机的运转一样,计算机运转的核心内容就是执行指令

java基础语法学习笔记(一)

此生再无相见时 提交于 2019-12-02 22:51:56
一、java语言的基础理解 1、java是大小写敏感的编程语言 2、类是构建所有java应用程序和applet的构建块,java应用程序中的全部内容都必须放置在类中。 关键字class后面紧跟类名,名字必须以字母开头,后面可以跟字母和数字的任意组合,长度基本上没有限制,但是不能使用java保留字。 虽然java中定义类名的规则很宽松,但是为了能够更好的编写java程序代码,我们还是遵循标准的java命名规范:类名是以大写字母开头的名词。如果名字由多个单词组成,每个单词的第一个字母都应该为大写,俗称”CamelCase”。 3、源代码的文件名必须与公有类的名字相同,并用.java作为扩展名。编译源代码文件后,会刘到一个包含该类字节码的文件,为.class文件。 4、运行编译程序时,java虚拟机将从指定类中的main方法开始执行。因此,在类的源文件中必须包含一个main方法,用户自己定义的方法添加到类中,在main中调用运行。 5、java源文件中的代码块是用一对{}来表示的。每条语句结尾用分号表示结束。 二、注释 java语言有三种表示注释的方式: 1、 单条注释用//,其注释内容从//开始到本行结尾。 2、 多行注释用/*和*/把注释括起来。 3、 以/**开始,以*/结束,这种注释方式可以用来自动生成文档。 三、数据类型 java是一种强类型语言(strongly typed

C# 位运算详解

匿名 (未验证) 提交于 2019-12-02 22:06:11
运算符 描述 &(位与) 当两个二进制操作位都为1时,结果就为1 |(位或) 当两个二进制操作位有1个为1时,结果就为1 ^(位异或) 当两个二进制操作位只有1个为1时,结果为1 ~(位非) 操作位的每个位都取反(就是0变成1,1变成0) <<(左移) 二进制左移运算符。左操作数的值向左移动右操作数指定的位数。 >>(右移) 二进制右移运算符。左操作数的值向右移动右操作数指定的位数。 pq实例图 p q p & q p | q p ^ q 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 1 0 0 1 1 如下 : int x=12,y=10; int a; a=x&y; //a=8 下面是计算试子的和加减法一样 上面说&运算时,当两个二进制操作位都为1时,结果就为1 换下来就是 1000(二进制) =8(十进制) 12&10=8 位非怎么运算呢? 文章来源: C# 位运算详解

mysql优化之Nested Join Optimization

匿名 (未验证) 提交于 2019-12-02 22:06:11
在MySQL中,CROSS JOIN在语法上等同于INNER JOIN;他们可以互相取代。但是在标准的SQL中,它们不是等价的。 INNER JOIN与ON子句一起使用;否则就使用CROSS JOIN。 通常,在仅包含内连接操作的连接表达式中可以忽略括号。 更确切地说,我们不能忽略left out join操作的右操作数和 right join 操作的左操作数中的括号。换句话说,我们不能忽略外连接操作的内部表表达式的括号。其他操作数的括号(外部表的操作数)可以忽略。 每当连接表达式(join_table)中的连接操作的执行顺序不是从左到右,我们认为存在嵌套连接。考虑以下查询: 在第一个查询中,嵌套连接由左连接操作构成。在第二个查询中, 嵌套连接 由一个内联接操作组成。 在第一个查询中,括号可以省略:连接表达式的语法结构将决定连接操作的执行顺序。对于第二个查询,不能省略括号,尽管这里的连接表达式可以毫无歧义地解释。但在我们的扩展语法中,第二个查询的(t2,t3)中的圆括号是必需的,尽管理论上查询可以在没有它们的情况下进行解析:我们仍然会为查询设置明确的语法结构,因为LEFT JOIN和ON扮演表达式(t2,t3)的左右分隔符。 文章来源: mysql优化之Nested Join Optimization

pymysql模块操作数据库与mysql数据备份

匿名 (未验证) 提交于 2019-12-02 22:06:11
host = '127.0.0.1' #计算机的IP地址 port = 3306 #数据库的端口号 user = 'root' #数据库的用户名 password = 'root' #用户密码 database = 'lucky' #要连接数据库名 charset = 'utf8' #链接数据的编码格式 import pymysql 1 :#查询 conn = pymysql . connect ( host = '127.0.0.1' , #主机 port = 3306 , #端口号 user = 'root' ,#用户名 password = '666' , #密码 database = 'day43' , #需要连接的库 charset = 'utf8' #指定编码 ) cursor = conn . cursor ()#获取游标,默认获取的是元祖嵌套形式的数据 sql = "select * from dep;" #sql语句 ret = cursor . execute ( sql ) #ret 受影响的行数 print ( cursor . fetchall ()) #取出所有的 print ( cursor . fetchmany ( 3 )) #取出多条不写参数默认是取一条 print ( cursor . fetchone ()) #取出单条 cursor .

《深入理解计算机系统》阅读笔记--程序的机器级表示(上)

匿名 (未验证) 提交于 2019-12-02 21:59:42
一、为什么要学习和了解汇编 编译器基于编程语言的规则,目标机器的指令集和操作系统遵循的惯例,经过一系列的阶段生成机器代码。GCC c语言编译器以汇编代码的形式产生输出,汇编代码是机器代码的文本表示,给出程序中的每一条指令。然后GCC调用汇编和链接器,根据汇编代码生成可执行的机器代码。这一章节其实就是来更加深入的认识和理解汇编代码 现在我们更多接触的都是一些高级语言,如JAVA,GO,Python,其实用这些语言的时候,更大程度上,已经屏蔽了一些程序的细节,即机器级的实现。但是如果是用汇编语言,程序员就必须制定程序用来执行计算的低级指令。 那么为什么我们还要学习和了解汇编呢? 虽然现在编译器已经替我们做了生成汇编代码的大部分工作,但是作为程序员,如果我们能够阅读和理解汇编代码将是一个非常重要的技能,好处是: 能够理解编译器的优化能力分析代码中隐含的低效率 如我们通过线程包写并发程序时,了解不同线程是如何共享程序数据或保持数据私有的,以及准确知道如何在哪里访问共享数据,这些在机器代码都是可见的 二、历史 Inter的处理器系统俗称x86,第一代处理器是8086,一个单芯片,16位微处理器,主要为 IBM PC 和 DOS 设计,有 1MB 的地址空间。八年后的 1985,第一个 32 位 Intel 处理器(IA32) 386 诞生。2004 年,奔腾(Pentium) 4E