字节码

JDK的下载安装以及环境变量的配置

时光总嘲笑我的痴心妄想 提交于 2019-12-06 13:08:51
一、JDK下载 下载地址: 点击到官网下载 点击进入官网Java Archive后,根据自己需求选择合适的版本点击进入(我以JavaSE8为例) 在跳转页面找到Java SDK版块,并点击接受许可证书,点击合适的JDK版本然后跳转到单点登录页面登录即可下载 通常32位的系统只支持32位的jdk,64位系统可以兼容32位和64位 也就是说,如果你是64位系统的,下载32位或64位的都可以!当然如果你下载了32位的,后边下载的工具也要都匹配到32位才可以! 注意事项:①Oracle官网下载需要先注册账号②毕竟是外国网站,下载较慢,最后采用迅雷下载等加速器下载)。 下载后JDK如下 二、JDK的安装 直接点击下一步到如下界面, 公共JRE选择不安装(JDK中包含有JRE),安装位置选择不带中文和空格的目录(预防使用时出现不可知的错误) 选择好后点击下一步直接安装JDK 三、配置环境变量 在没有配置环境变量之前,在命令行窗口运行javac和java命令会提示如下图信息,提示JDK还不能使用 这是因为虽然已经在计算机里安装了JDK,而JDK的安装路径下也包含了javac和java两个命令,但是计算机不知道到哪里去搜寻这两个命令! 计算机如何查找命令呢?Windows操作系统根据Path环境变量来查找命令。 Java程序要经过“编写Java源代码→编译Java源代码生成class字节码文件

python函数得执行过程

ぐ巨炮叔叔 提交于 2019-12-06 13:07:26
对于 Python 常规函数,都只有一个入口,但会有多个出口如 return 返回或者抛出异常。函数从入口进入会一直运行到 return 语句或者抛出异常,中间不会暂停,函数一直拥有控制权。当运行结束,才将控制权还给调用者。 前文介绍过,当执行 Python 代码时,会先将代码编译成字节码,然后在虚拟机中解释执行字节码,编译好的字节码会保存在 .pyc 或 .pyd 扩展名的文件里。在运行时,虚拟机会创建字节码执行的上下文环境,Python 模拟 C 语言中的运行栈作为运行时的环境,使用PyFrameObject表示运行时的栈,而字节码会存储在 PyCodeObject 对象中。 Python 解释器是基于栈的,其中有三种栈:调用栈 (frame stack)、数据栈 (data stack)、块栈 (block statck)。 PyFrameObject 存在于调用栈,其中字段 f_back 指向上一级 PyFrameObject,这样就形成了一个调用链。每个调用栈对应函数的一次调用。调用栈中会有自己的数据栈和块栈,数据栈中会存放字节码操作的数据,块栈用于特定的控制流块,比如循环和异常处理。 打开终端,在命令行输入 python3 或 ipython 命令打开 Python 命令行交互解释器: 如果使用 ipython 需提前安装,需要在 Python 3 环境下。 pip3

浅谈java类的加载机制

六眼飞鱼酱① 提交于 2019-12-06 12:57:33
在java中,运行java程序产生字节码文件,本身我们输入的数据机器是无法识别的,因为机器中存储的是二进制数据,所以类加载指的是将类的class文件中的二进制数据读入到内存中,把它放到运行时数据区的发方法内,然后创建一个java.lang.Class对象来封装方法区内的数据结构。类的加载最终是在堆区内的Class对象,Class对象封装了类在方法去内的数据结构,也向我们听过了访问的接口。 为什么java语言具有跨平台性 ,实际上是因为字节码文件,任意一个平台上,只要能够识别字节码,就相当于能够运行java程序。 类的加载方式有三种: 第一种:通过命令行启动JVM初始化加载 第二种:也是常用的通过Class.forName方法动态加载 第三种:通过ClassLoader.loadClass方法动态加载 来源: https://www.cnblogs.com/zhao-hao/p/11985586.html

JVM内运行时数据区

拥有回忆 提交于 2019-12-06 12:54:14
JVM的基本区域:    类加载子系统        运行时数据区(内存区域)        执行引擎      运行时数据区域          方法区(Method Area)     类的所有字和方法字节码,以及一些特殊方法如构造函数,接口代码也在这里定义。简单来说,所有定义的方法的信息都保存在该区域,静态变量+常量+类信息(构造方法/接口定义)+运行时常量池都存在方法区中,虽然java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non+Heap(堆),目的应该是为了和java的堆区分开;   堆(Heap)     虚拟机启动时自动分配创建,用于存放对象的实例,几乎所有对象在堆上分配内存,当对象无法在该空间申请到内存是将抛出OutOfMemoryError异常。同时也是垃圾收集器管理的主要区域;             新生代           类出生,成长,消亡的区域,一个类在这里产生,应用,最后被垃圾回收器收集,结束生命。         新生代分为两部分:伊甸区(Eden space)和幸存者(Survivor space),所有的类都是在伊甸区被new出来的。辛存区又分为From和To区。当Eden区的空间用完时,程序又需要创建对象,JVM的垃圾回收器将Eden区进行垃圾回收(Minor GC),将Eden区中的不再被对象应用的对象进行销毁

Java字节码深度剖析

偶尔善良 提交于 2019-12-06 12:07:18
Java字节码文件查看 我们有一个类Test01,具体内容如下: package bytecode; public class Test01 { private int i = 0; public int getI() { return i; } public void setI(int i) { this.i = i; } } 编译这个类,得到Test01.class文件 IDE查看 用IDEA编译器查看 我们发现查看到的class文件与类文件基本相同,这是因为IDE自带的 Fernflower decompiler 将字节码文件反编译的结果。我们可以在插件市场查找安装 jclasslib 插件,来在IDEA中查看class文件。 hexedit查看 通过 hexedit 直接查看该字节码文件 扩展:hexedit安装 输入: sudo apt install hexedit 当你启动它时,你必须指定要打开的文件的位置,然后它会为你打开它。 javap -verbose查看 通过javap指令查看字节码文件: javap -verbose **** 执行 javap -verbose 指令,得到的结果如下: Classfile /home/fanxuan/Study/java/jvmStudy/out/production/jvmStudy/bytecode/Test01

5.3.10 执行引擎

穿精又带淫゛_ 提交于 2019-12-06 10:56:40
任何Java虚拟机实现的核心都是它的执行引擎。在Java虚拟机规范中,执行引擎的行为使用 指令集来定义。对于每条指令,规范都详细规定了当实现执行到该指令时应该处理什么,但是却对如何处理言之甚少。在前面的章节中提到过,实现的设计者有权决定如何执行字节码:实 现可以采取解释、即时编译或直接用芯片上的指令执行,还可以是它们的混合,或任何你能想 到的新技术。 和本章幵头提到的对“Java虚拟机”这个术语有三种不同的理解一样,“执行引擎”这个术 语也可以有三种理解:一个是抽象的规范,一个是具体的实现,另一个是正在运行的实例,抽象规范使用指令集规定了执行引擎的行为。具体实现可能使用多种不同的技术——包括软件方 面、硬件方面或数种技术的集合。作为运行时实例的执行引擎就是一个线程。 运行中Java程序的每一个线程都是一个独立的虚拟机执行引擎的实例。从线程生命周期的开始到结束,它要么在执行字节码,要么在执行本地方法。一个线程可能通过解释或者使用芯片 级指令直接执行字节码,或者间接通过即时编译器执行编译过的本地代码。Java虚拟机的实现可 用一些对用户程序不可见的线程,比如垃圾收集器。这样的线程不需要是实现的执行引擎的 实例。所有属于用户运行程序的线程,都是在实际工作的执行引擎。 指令集方法的字节码流是由Java虚拟机的指令序列构成的,每一条指令包含一个单字节的操作码,后面跟随0个或多个操作数

JAVA Class文件和类加载机制

别等时光非礼了梦想. 提交于 2019-12-06 08:44:05
1 class文件结构 Class文件结构是了解虚拟机的重要基础之一,如果想深入的了解虚拟机,Class文件结构是不能不了解的。 Class文件是一组以8位字节为基础单位的二进制流,各项数据项目严格按照顺序紧凑地排列在Class文件之中,中间没有添加任何分隔符,如果是超过8位字节以上空间的数据项,则会按照高位在前的方式(Big-Endian)分割成若干个8位字节进行存储。(Big-Endian模式具体可见 详解大端模式和小端模式 ) Class文件中包含了Java虚拟机指令集和符号表以及若干其他辅助信息。 Class文件格式只有两种数据类型:无符号数和表。 无符号数属于基本的数据类型,以u1,u2,u4,u8来分别代表1个字节,2个字节,4个字节和8个字节的无符号数;可用来描述数字,索引引用,数量值或者按照UTF-8编码构成的字符串值。 表是由 多个无符号数或者其他表作为数据项构成的复合数据类型 ,所有表都习惯性地以“_info”结尾。表用于描述由层次关系的复合结构的数据。 整个Class文件本质上就是一张表 class文件的内容中没有任何的分隔符号,所以在上表中的数据项,无论是顺序还是数量,都是被严格限定的,哪个字节代表什么含义,长度多少,先后顺序如何,都不允许改变。 1.1 魔数和class文件的版本 Class文件的头4个字节成为魔数(Magic Number)

JavaWeb(一):Java技术概览

試著忘記壹切 提交于 2019-12-06 07:03:52
一、Java技术体系 在早期,Java被称为Java开发工具包或JDK,是一门与平台(由一组 必需的API组成)紧密耦合的语言。 从1998年底的1.2版本开始,Java技术栈被分割为下面关键部分: Java是一门包含了严格和强类型语法的语言。 Java 2平台标准版本,被称为J2SE,指的是平台以及java.lang和java.io包中包含的类。它是构建Java应用程序的基础。 Java虚拟机或JVM是一个可运行编译后Java代码的软件虚拟机。因为被编译过的Java代码只是字节码,JVM将在运行代码之前,把字节码编译成机器码。JVM还负责管理内存,从而实现了应用程序代码的简化。 Java开发工具包或JDK。它包括了Java语言编译器、文档生成器、与本地代码协作的工具和用于调试平台类的Java源代码。 Java运行时环境或JRE曾经并且现在也仍是终端用户用于运行编译后Java应用程序的软件。它包含了JVM但不含任何JDK中的开发工具。而JDK包含了一个JRE(即jdk既包含开发工具又包含JRE)。 上述5个组件曾经都只是 规范 ,而不是实现。任何公司都可以通过规范实现Java技术栈,比如IBM有自己的JDK。开源社区则形成了OpenJDK项目,该项目提供Java栈的开源实现。 我们在Oracle网站下载的JDK,实际也是一种实现,sun公司最初就提供了Java、J2SE、JVM

JVM(二) 栈内存结构

孤街醉人 提交于 2019-12-05 20:43:47
栈内存是描述java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、返回出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。栈帧(Frame)是用来存储数据和部分过程结果的数据结构,同时也被用来处理动态链接(Dynamic Linking)、方法返回值和异常分派(Dispatch Exception)。栈帧随着方法调用而创建,随着方法结束而销毁——无论方法是正常完成还是异常完成(抛出了在方法内未被捕获的异常)都算作方法结束。 局部变量表 局部变量表(Local Variables Table)也可以称之为本地变量表,它包含在一个独立的栈帧中。顾名思义,局部变量表主要用于存储方法参数和定义在方法体内的局部变量,这些数据类型包括各类原始数据类型、对象引用(reference),以及returnAddress类型。局部变量表所需的容量大小在编译期就可以被完全确定下来,并保存在方法的Code属性中。大家思考一下,既然方法体内定义的局部变量是存储在栈帧中的局部变量表里的,那么原始数据类型的成员变量的值是否也存储在局部变量表中呢?其实如果是定义在方法体外的成员变量,不止是作用域发生了变化,更重要的是,其值也并非还是存储在局部变量表里,而是存储在对象内存空间的实例数据中

Java泛型-类型擦除

天涯浪子 提交于 2019-12-05 20:00:26
一、概述 Java泛型在使用过程有诸多的问题,如不存在List<String>.class, List<Integer>不能赋值给List<Number>(不可协变),奇怪的ClassCastException等。 正确的使用Java泛型需要深入的了解Java的一些概念,如协变,桥接方法,以及这篇笔记记录的类型擦除。Java泛型的处理几乎都在编译器中进行,编译器生成的bytecode是不包涵泛型信息的,泛型类型信息将在编译处理是被擦除,这个过程即类型擦除。 二、编译器如何处理泛型? 通常情况下,一个编译器处理泛型有两种方式: 1.Code specialization。在实例化一个泛型类或泛型方法时都产生一份新的目标代码(字节码or二进制代码)。例如,针对一个泛型list,可能需要 针对string,integer,float产生三份目标代码。 2.Code sharing。对每个泛型类只生成唯一的一份目标代码;该泛型类的所有实例都映射到这份目标代码上,在需要的时候执行类型检查和类型转换。 C++中的模板(template)是典型的Code specialization实现。C++编译器会为每一个泛型类实例生成一份执行代码。执行代码中integer list和string list是两种不同的类型。这样会导致代码膨胀(code bloat),不过有经验的C+