字节码

Java虚拟机架构

倾然丶 夕夏残阳落幕 提交于 2020-02-02 05:51:39
Java虚拟机架构 类加载器子系统 加载 链接 初始化 运行时数据区(Runtime Data Area) 方法区(Method Area) 堆区(Heap Area) 栈区(Stack Area) PC寄存器 本地方法栈 执行引擎 解释器 编译器 垃圾回收器   JVM被分为三个主要的子系统: 类加载器子系统 、 运行时数据区 、 执行引擎 类加载器子系统   Java的动态类加载功能是由类加载器子系统处理。当它在运行时(不是编译时)首次引用一个类时,它加载、链接并初始化该类文件。 加载   类由此组件加载。启动类加载器 (BootStrap class Loader)、扩展类加载器(Extension class Loader)和应用程序类加载器(Application class Loader) 这三种类加载器帮助完成类的加载。 启动类加载器 – 负责从启动类路径中加载类,无非就是rt.jar。这个加载器会被赋予最高优先级 扩展类加载器 – 负责加载ext 目录(jre\lib)内的类 应用程序类加载器 – 负责加载应用程序级别类路径,涉及到路径的环境变量等 上述的类加载器会遵循委托层次算法(Delegation Hierarchy Algorithm)加载类文件。 链接 校验 – 字节码校验器会校验生成的字节码是否正确,如果校验失败,会得到校验错误 准备 –

JVM认知(一)

别等时光非礼了梦想. 提交于 2020-02-02 03:42:56
接下来的几篇博客只是对JVM的一个简单认知,主要是对JVM的组成部分以及程序的运行流程的一个介绍,并没有深入到每一个层次的每一个点,如果有错或者以后掌握到更深入层次的知识后,还会更新的。 JVM:Java Virtual Machine(Java虚拟机) 先看一张图,在最开始接触Java的时候的HelloWorld的运行: 我们编写的Java文件,经过javac指令,编译成为class字节码文件,再将字节码文件放到Java运行环境中运行。我们都知道,Java是个跨平台的语言,那么如何实现在windows环境以及linux环境都可以运行呢?JVM就起到了关键作用。JVM就是从软件层面屏蔽不同操作系统在底层硬件与指令的不同。 那么,JVM到底是什么,或者说长什么样呢? 我们来看下JVM的模型图: 可以看到,JVM主要由三部分组成:类装载子系统、运行时数据区、字节码执行引擎。其中运行时数据区则是主要部分。 首先来看栈部分:栈用来存储局部变量。 先来看一段简单代码: package com . hpu . dong ; public class test { public static final int m = 100 ; public static User user = new User ( ) ; public int add ( ) { int a = 1 ; int b = 2

2.8函数基础

孤街醉人 提交于 2020-02-02 02:45:04
函数基础 目标 函数的快速体验 函数的基本使用 函数的参数 函数的返回值 函数的嵌套调用 在模块中定义函数 01. 函数的快速体验 1.1 快速体验 所谓 函数 ,就是把 具有独立功能的代码块 组织为一个小模块,在需要的时候 调用 函数的使用包含两个步骤: 定义函数 —— 封装 独立的功能 调用函数 —— 享受 封装 的成果 函数的作用 ,在开发程序时,使用函数可以提高编写的效率以及代码的 重用 演练步骤 新建 04_函数 项目 复制之前完成的 乘法表 文件 修改文件,增加函数定义 multiple_table(): 新建另外一个文件,使用 import 导入并且调用函数 02. 函数基本使用 2.1 函数的定义 定义函数的格式如下: ```python def 函数名(): 函数封装的代码 …… ``` def 是英文 define 的缩写 函数名称 应该能够表达 函数封装代码 的功能,方便后续的调用 函数名称 的命名应该 符合 标识符的命名规则 可以由 字母 、 下划线 和 数字 组成 不能以数字开头 不能与关键字重名 2.2 函数调用 调用函数很简单的,通过 函数名() 即可完成对函数的调用 2.3 第一个函数演练 需求 1. 编写一个打招呼 say_hello 的函数,封装三行打招呼的代码 2. 在函数下方调用打招呼的代码 ```python name = "小明"

JVM学习记录

寵の児 提交于 2020-02-02 01:02:34
目录 第一章 JVM与Java体系结构 1.字节码 2.虚拟机 3.JVM的位置 4.JVM的整体结构 5.Java代码执行流程 6.JVM的架构模型 7. JVM的生命周期 第二章 类加载子系统 1.类加载器与类的加载过程 2.类加载器的分类 3.ClassLoader的使用说明 4.双亲委派机制 5.沙箱安全机制 第三章 运行时数据区及线程 1.运行时数据区 ​ 2.线程 第四章 程序计数器(pc寄存器) 1.相关面试题 第五章 虚拟机栈 1.虚拟机栈概述 2.栈的存储单位 3.局部变量表 4.操作数栈 5.代码追踪 6.栈顶缓存技术 7.动态链接(指向运行时常量池方法的引用) 8.方法的调用:解析与分派 9.方法返回地址(return address) 10.一些附加信息 第六章 本地方法接口与本地方法栈 1.本地方法接口 2.本地方法栈 第一章 JVM与Java体系结构 1.字节码 不同的编译器,可以编译出相同的字节码文件,字节码文件也可以在不同的jvm上运行 Java虚拟机与Java语言并没有必然联系,它只与特定的二进制文件格式——class文件格式所关联,class文件中包含了Java虚拟机指令集(字节码)和符号表,和其他辅助信息 2.虚拟机 虚拟机就是一台虚拟的计算机,是一款软件,用来执行一系列虚拟的计算机指令 系统虚拟机:VMware,对物理计算机的仿真

深入理解JVM:虚拟机字节码执行引擎

可紊 提交于 2020-02-02 00:40:25
一、运行时栈结构 栈帧 是用于支持虚拟机进行方法调用和方法执行的数据结构。 栈帧 包括: 局部变量表、操作数栈、动态连接、方法的返回地址 和一些额外的附加信息。 执行引擎运行的所有字节码指令只针对当前栈帧进行操作。需要注意的是一个栈中能容纳的栈帧是受限,过深的方法调用可能会导致StackOverFlowError,当然,我们可以认为设置栈的大小。其模型示意图大体如下: 执行引擎的所有字节码指令都只针对当前栈帧进行操作。 1、局部变量表 是变量值的存储空间,由方法参数和方法内部定义的局部变量组成,其容量用Slot 1 作为最小单位。 slot可以存放32位以内的数据类型。slot的长度可以随处理器、操作系统或虚拟机不同而发生改变。 局部变量表 的大小在编译时就可以确定,Code中的max_local。 局部变量表 不存在系统初始化的过程,这意味着一旦定义了局部变量则必须人为的初始化,否则无法使用。 JVM通过索引定位方式使用 局部变量表 。 在方法执行时,如果是实例方法,那么局部变量表的第0位索引的slot默认是用于传递方法所属类实例的引用(也就是this)。 2、操作数栈 操作数栈 的最大深度也在编译的时候写入到Code属性的max_stacks数据项中。 另外我们说Java虚拟机的解释引擎是基于栈的执行引擎,其中的栈指的就是 操作数栈 。 操作数栈

基础篇-java类文件结构

半腔热情 提交于 2020-02-01 13:48:06
问题:是不是只有java编译器才能完成java到class字节码文件的过程? Jython/Scala/Groovy/Jruby都是可以编译成字节码文件的,然后放到java虚拟机里面执行 问题:计算机执行的指令的时候都是执行的 0101010 这种形式的指令 class文件的组成内容: class文件格式: u1代表一个字节, u2代表两个字节, u4代表4俄字节, u8代表8个字节 来源: CSDN 作者: qq_26498709 链接: https://blog.csdn.net/qq_26498709/article/details/104128307

这一次,终于系统的学习了 JVM 内存结构

时光总嘲笑我的痴心妄想 提交于 2020-02-01 02:37:33
这一次,终于系统的学习了 JVM 内存结构 原创平头哥的技术博文 最后发布于2019-11-05 11:15:20 阅读数 5652 收藏 展开 最近在看《 JAVA并发编程实践 》这本书,里面涉及到了 Java 内存模型,通过 Java 内存模型顺理成章的来到的 JVM 内存结构,关于 JVM 内存结构的认知还停留在上大学那会的课堂上,一直没有系统的学习这一块的知识,所以这一次我把《 深入理解Java虚拟机JVM高级特性与最佳实践 》、《 Java虚拟机规范 Java SE 8版 》这两本书中关于 JVM 内存结构的部分都看了一遍,算是对 JVM 内存结构有了新的认识。JVM 内存结构是指:Java 虚拟机定义了若干种程序运行期间会使用的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁,另一些则与线程一一对应,随着线程的开始而创建,随着线程的结束而销毁。具体的运行时数据区如下图所示: 在 Java 虚拟机规范中,定义了五种运行时数据区,分别是 Java 堆、方法区、虚拟机栈、本地方法区、程序计数器,其中 Java 堆和方法区是线程共享的。接下来就具体看看这 五种运行时数据区。 Java 堆(Heap) Java 堆是所有线程共享的一块内存区域,它在虚拟机启动时 就会被创建,并且单个 JVM 进程有且仅有一个 Java 堆。Java 堆是用来存放对象实例及数组

JAVA常用特性:反射机制

安稳与你 提交于 2020-01-31 00:52:01
反射: 反射的本质就是 通过一段字符串得到一个类的字节码文件 ,随后可以进行属性,方法等的操作。需要依赖 Class工具类 , 反射可以用来解耦合; 反射可以用来进行功能的拓展。 配置文件的读取: 1.通过类加载器 2.通过创建文件夹的方式 ................. ? 129.如何获取一个类的字节码对象 得到字节码对象clazz的方式有三种: 1).对象名.getClass() 2).类名.class 3).Class.forName(String 全类名):包名+类名( 借助Class工具类,反射的基础 ) 130.使用三种方式获 得同一个类字节码对象,是否是同一个对象 是的,因为一个类的Class对象只有一个 131.如何使用字节码对象创建对象 Object o = clazz .newInstance(),字节码对象clazz可以直接使用 newInstance()方法 来创建对象,但前提是该类中存在无参构造方法。 创建对象的另外一种方式是:先使用字节码对象获取构造方法,再利用构造方法调用newInstance(参数列表)方法创建对象。 132.如何使用字节码对象获取公共访问权限的构造方法的数组 Constructor<?>[] c1 = clazz .getConstructors(),使用字节码对象clazz调用getConstructors()方法

Java基础知识-Java中基本语法

回眸只為那壹抹淺笑 提交于 2020-01-30 18:34:24
Java程序运行原理:JVM 源程序( .java文件)——Java编译器——字节码( .class文件)——类装载器——字节码校验器——解释器——操作平台 jdk,jre,jvm三者区别和关系 jdk(Java Development Kits) 开发者工具包/Java开发工具集 jre(Java Runtime Environment) Java运行时环境 jvm 虚拟机 jdk包含jre,jre包含jvm Java API应用程序编程接口 Java编辑器(Javac.exe) Java运行时解释器(Java.exe) Java文档化工具(Javadoc.exe)及其他工具及资源 JRE的三项主要功能: 加载代码:由列加载器(class,loader)完成; 校验代码:有字节码校验器(bytecode,verifier)完成 执行代码:由运行是解释器(runtime,interpreter)完成 在终端中如何编译和执行Java代码? 编译 javac 源文件名 执行 java 文件名(不带后缀,如class) Java书写Hello world! 其中public为修饰符——公共的,static为修饰符——静态的,void为无返回值,main为方法名,String为字符串,String[]数组,args为数组名,System系统,out为输出,class为类

Python环境搭建-2 编译器和解释器

走远了吗. 提交于 2020-01-30 18:18:44
编译器与解释器 编译器/解释器:高级语言与机器之间的翻译官 都是将代码翻译成机器可以执行的二进制机器码,只不过在运行原理和翻译过程有不同而已。 那么两者有什么区别呢? 编译器:先整体编译再执行 解释器:边解释边执行 用一个通俗的例子进行比喻:我们去饭馆吃饭,点了八菜一汤。编译器的方式就是厨师把所有的菜给你全做好了,一起给你端上来,至于你在哪吃,怎么吃,随便。解释器的方式就是厨师做好一个菜给你上一个菜,你就吃这个菜,而且必须在饭店里吃。 Python解释器种类 Python有好几种版本的解释器: CPython:官方版本的解释器。这个解释器是用C语言开发的,所以叫CPython。CPython是使用最广的Python解释器。我们通常说的、下载的、讨论的、使用的都是这个解释器。 Ipython:基于CPython之上的一个交互式解释器,在交互方式上有所增强,执行Python代码的功能和CPython是完全一样的。CPython用>>>作为提示符,而IPython用In [序号]:作为提示符。 PyPy:一个追求执行速度的Python解释器。采用JIT技术,对Python代码进行动态编译(注意,不是解释),可以显著提高Python代码的执行速度。绝大部分CPython代码都可以在PyPy下运行,但还是有一些不同的,这就导致相同的Python代码在两种解释器下执行可能会有不同的结果。