字节码

python基本--数据类型

孤人 提交于 2020-01-01 21:23:12
一、ptyhon 介绍 ptyhon语言是指Python的语言风格,和它自己的语法结构等, python解释器是去解释并执行的一个软件, Cpython(最常用的版本) Python的官方版本,使用C语言实现,使用最为广泛,CPython实现会将源文件(py文件)转换成字节码文件(pyc文件),然后运行在Python虚拟机上。 Jyhton Python的Java实现,Jython会将Python代码动态编译成Java字节码,然后在JVM上运行。 IronPython Python的C#实现,IronPython将Python代码编译成C#字节码,然后在CLR上运行。(与Jython类似) PyPy(特殊) Python实现的Python,将Python的字节码字节码再编译成机器码。 RubyPython、Brython ... 二、python解释器的安装 window下的安装: 1下载安装,从www.python.org,下载安装python最新版本,最好下载python2版本和python3版本, 注意下载python2和python3的安装路径, 在任何位置如果要找到Python2和3 ,就要在环境变量里设置,找到python.exe文件, 方法:计算机--属性--高级系统设置--环境变量--系统设置 找到script文件,添加script的路径,就可以调用pip命令

Java代码如何运行?

限于喜欢 提交于 2020-01-01 09:50:04
C++将代码编译成机器码给机器阅读 编译器将Java程序转换成 Java字节码 Java 虚拟机具体是怎样运行 Java 字节码的 一次编写,到处运行 Java虚拟机可以由硬件实现,也可以在各个现有平台提供软件实现。一旦一个程序被转换成 Java 字节码,那么它便可以在不同平台上的虚拟机实现里运行 调用方法时,Java虚拟机会在当前线程的Java方法栈(包括本地方法栈和虚拟机方法栈)中生成一个 栈帧 ,用于 存放局部变量及字节码的操作数 。这个栈帧的大小是提前计算好的,而且 Java 虚拟机 不要求栈帧在内存空间里连续分布 。当退出当前执行的方法时,不管是正常返回还是异常返回,Java 虚拟机均会弹出当前线程的当前栈帧,并将之舍弃。 Java虚拟机将字节码翻译成机器码的过程 解释执行: 逐条将字节码翻译成机器码并执行 即时编译(,Just-In-Time Compilation,JIT):将一个方法中所有字节码编译成机器码后再执行。 HotSpot 默认采用混合模式,综合了解释执行和即时编译两者的优点。它会先 解释执行字节码,而后将其中反复执行的热点代码,以方法为单位进行即时编译 。 Java 虚拟机的运行效率 即时编译后的 Java 程序 的执行效率,是可能超过 C++ 程序的。这是因为与 C++静态编译 相比,即时编译拥有程序的运行时信息,并且能够根据这个信息 做出相应的优化

jvm系列(一)之内存模型

£可爱£侵袭症+ 提交于 2019-12-31 23:02:53
JVM内存结构 Java内存模型是指Java虚拟机的内存模型,我们来看下Java内存模型的图片: VM内存模型主要分为三块:Java 堆内存(Heap)、方法区(Non-Heap)、JMV栈(JVM Stack)、本地方法栈(Native Method Stacks)、程序计数器(Program Counter Register)。 Java堆(Heap) 对于大多数应用来说,Java堆(Java Heap)是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。 Java堆是垃圾收集器管理的主要区域,因此很多时候也被称做“GC堆”。如果从内存回收的角度看,由于现在收集器基本都是采用的分代收集算法,所以Java堆中还可以细分为:新生代和老年代;再细致一点的有Eden空间、From Survivor空间、To Survivor空间等。 根据Java虚拟机规范的规定,Java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可,就像我们的磁盘空间一样。在实现时,既可以实现成固定大小的,也可以是可扩展的,不过当前主流的虚拟机都是按照可扩展来实现的(通过-Xmx和-Xms控制)。 如果在堆中没有内存完成实例分配,并且堆也无法再扩展时

探秘 Java 热部署三(Java agent agentmain)

让人想犯罪 __ 提交于 2019-12-31 02:52:36
前言 让我们继续探秘 Java 热部署。在前文 探秘 Java 热部署二(Java agent premain) 中,我们介绍了 Java agent premain。通过在main方法之前通过类似 AOP 的方式添加 premain 方法,我们可以在类加载之前做修改字节码的操作,无论是第一次加载,还是每次新的 ClassLoader 加载,都会经过 ClassFileTransformer 的 transform 方法,也就是说,都可以在这个方法中修改字节码,虽然他的方法名是 premain ,但是我们确实可以利用这个特性做这个事情。 在文章的最后,我们也提到了,虽然相比较在自定义类中修改字节码,premain 没有什么侵入性,对业务透明,但是美中不足的是,他还需要在启动的时候增加参数。 我们还提到了,premain 虽然可以热部署,但是还需要重新创建类加载器,虽然,这的确也符合 JVM 关于类的唯一性的定义。但是,有一种情况,如果使用的是系统类加载器,我们也无法创建新的ClassLoader对象。那么我们也就无法重新加载类了,怎么办呢?还好 Java 6 为我们提供了一种方法,也就是今天的主角 agentmain。 1. 什么是 agentmain? 和 premain 师出同门,我们知道,premain 只能在类加载之前修改字节码,类加载之后无能为力

Java程序运行原理分析

北战南征 提交于 2019-12-30 23:33:18
1. JVM 简介 java源码被编译器成class字节码,然后由JVM运行的时候进行处理,下面一部分主要是JVM根据不同的操作系统进行的适配。 线程独占 :每个线程都会有它独立占据的空间,随线程生命周期而创建和销毁 线程贡献 :所有线程都能访问这块内存数据,随虚拟机或者GC创建和销毁 方法区 :用来存储加载的类的信息、常量、静态变量、编译后的代码等东西的。方法区在1.7以前把它叫做永久代,1.8之后叫做元数据空间。 虚拟机栈 :主要就是存储栈帧的,一个线程的执行会有一个或多个方法被执行,这个时候一个栈帧就对应一个方法。栈帧的内容包括: 局部变量表 操作数栈 动态链接 方法返回地址 附加信息等 栈内存默认大小为1M,如果超出会报StackOverflowError;(就像你写一个无限递归的方法,肯定会报这个错) 本地方法栈 :和虚拟机栈差不多,但是放的是本地方法(native修饰的),超出大小也会报StackOverflowError 程序计数器 :记录当前线程执行字节码的位置,存储的是字节码指令地址,如果执行Native方法,则计数器值为空。它在每个线程的私有空间中占有一部分空间,只是很小的一部分。它是因为CPU在同一时间只会执行一个线程,所以需要记录下当前执行的位置,使得激活的时候可以无缝衔接。 2. Class文件简介 class文件是一串二进制流,中间无任何分隔符

2020年大前端发展趋势

流过昼夜 提交于 2019-12-30 22:53:08
迅速发展的前端开发,在每⼀年,都为开发者带来了新的关键词。2019 年已步⼊尾声,2020 年前端发展的关键词⼜将有哪些呢?发展的方向又会是什么呢?参考2019年大前端的发展,不出意外,前端依旧会围绕⼩程序、超级APP、跨端开发、前端⼯程化以及新技术运用等几个方面进行展开(可以参考2019年大前端技术趋势深度解读)。 小程序 在⼩程序⽅⾯,今年仍然是⼩程序突⻜猛进的⼀年,各⼤主流的 App 都上线了⼩程序能⼒的⽀持,各前端团队也都有了专⻔的⼩程序开发团队,以适应更快的⼩程序开发需求。同时App 中很多关键的功能都被⼩程序所替代,甚⾄有些 App 已经变成 Native ⼩程序壳,上层的应⽤实现全部是⼩程序。 在微信小程序出现以前,大家在谈 Hybird、ReactNative,但终归只是技术层面的狂欢,始终没有业务属性的注入。小程序的出现,一方面告诉业界在当前设备上 Webview 也没差到哪去,另外一方面告诉业界如何让有能力的商家在超级 APP上进行私域运营。 另一方面,从技术角度说,在上层 DSL 的严格限制下,超级 APP 就可定义符合自己诉求的 Web 标准,弥补当前 Web 标准的不足,最后和客户端配合,结合离线、预加载、定制Webview 能产出类似于 NSR 等各种酷炫的技术模型,让 Web 在端内低成本达到 Native 版的体验,端外也不会像 Weex

从1+1=2来理解Java字节码

拜拜、爱过 提交于 2019-12-30 08:11:52
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 背景 前不久《深入理解Java虚拟机》第三版发布了,赶紧买来看了看新版的内容,这本书更新了很多新版本虚拟机的内容,还对以前的部分内容进行了重构,还是值得去看的。本着复习和巩固的态度,我决定来编译一个简单的类文件来分析Java的字节码内容,来帮助理解和巩固Java字节码知识,希望也对阅读本文的你有所帮助。 说明:本次采用的环境是OpenJdk12 编译“1+1”代码 首先我们需要写个简单的小程序,1+1的程序,学习就要从最简单的1+1开始,代码如下: package top.luozhou.test; /** * @description: * @author: luozhou * @create: 2019-12-25 21:28 **/ public class TestJava { public static void main(String[] args) { int a=1+1; System.out.println(a); } } 写好java类文件后,首先执行命令 javac TestJava.java 编译类文件,生成 TestJava.class 。 然后执行反编译命令 javap -verbose TestJava ,字节码结果显示如下: Compiled from "TestJava

JVM 字节码 对照表

拥有回忆 提交于 2019-12-28 20:19:40
字节码 助记符 指令含义 0x00 nop None 0x01 aconst_null 将null推送至栈顶 0x02 iconst_m1 将int型-1推送至栈顶 0x03 iconst_0 将int型0推送至栈顶 0x04 iconst_1 将int型1推送至栈顶 0x05 iconst_2 将int型2推送至栈顶 0x06 iconst_3 将int型3推送至栈顶 0x07 iconst_4 将int型4推送至栈顶 0x08 iconst_5 将int型5推送至栈顶 0x09 lconst_0 将long型0推送至栈顶 0x0a lconst_1 将long型1推送至栈顶 0x0b fconst_0 将float型0推送至栈顶 0x0c fconst_1 将float型1推送至栈顶 0x0d fconst_2 将float型2推送至栈顶 0x0e dconst_0 将double型0推送至栈顶 0x0f dconst_1 将double型1推送至栈顶 0x10 bipush 将单字节的常量值(-128~127)推送至栈顶 0x11 sipush 将一个短整型常量(-32768~32767)推送至栈顶 0x12 ldc 将int,float或String型常量值从常量池中推送至栈顶 0x13 ldc_w 将int,float或String型常量值从常量池中推送至栈顶(宽索引)

【深入Java虚拟机】之七:Javac编译与JIT编译

那年仲夏 提交于 2019-12-28 18:04:33
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 转载请注明出处: http://blog.csdn .NET /ns_code/article/details/18009455 编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理机的目标代码或虚拟机能执行的指令集之前,都会按照如下图所示的各个步骤进行: 其中绿色的模块可以选择性实现。很容易看出,上图中间的那条分支是解释执行的过程(即一条字节码一条字节码地解释执行,如 JavaScript ),而下面的那条分支就是传统编译原理中从源代码到目标机器代码的生成过程。 如今,基于物理机、虚拟机等的语言,大多都遵循这种基于现代经典编译原理的思路,在执行前先对程序源码进行词法解析和语法解析处理,把源码转化为抽象语法树。对于一门具体语言的实现来说,词法和语法分析乃至后面的优化器和目标代码生成器都可以选择独立于执行引擎,形成一个完整意义的编译器去实现,这类代表是C/C++语言。也可以把抽象语法树或指令流之前的步骤实现一个半独立的编译器,这类代表是 Java 语言。又或者可以把这些步骤和执行引擎全部集中在一起实现,如大多数的JavaScript执行器。 Javac编译 在Java中提到“编译”,自然很容易想到Javac编译器将*.java文件编译成为*.class文件的过程

Java中反射机制详解

安稳与你 提交于 2019-12-27 23:35:44
    序言       在学习java基础时,由于学的不扎实,讲的实用性不强,就觉得没用,很多重要的知识就那样一笔带过了,像这个马上要讲的反射机制一样,当时学的时候就忽略了,到后来学习的知识中,很多东西动不动就用反射,所以回过头来把这个给重新补一下,自己欠下的债,迟早是要还的。                                       ---WZY 一、什么是反射?     在运行状态中,对于 任意 一个类,都能够获取到这个类的所有属性和方法,对于 任意 一个对象,都能够调用它的 任意 一个方法和属性(包括私有的方法和属性),这种动态获取的信息以及动态调用对象的方法的功能就称为java语言的反射机制。通俗点讲,通过反射,该类对我们来说是完全透明的,想要获取任何东西都可以。     想要使用反射机制,就必须要先获取到该类的字节码文件对象(.class),通过字节码文件对象,就能够通过该类中的方法获取到我们想要的所有信息(方法,属性,类名,父类名,实现的所有接口等等),每一个类对应着一个字节码文件也就对应着一个Class类型的对象,也就是字节码文件对象。     获取字节码文件对象的三种方式。        1、Class clazz1 = Class.forName("全限定类名");  //通过Class类中的静态方法forName