字节码

Class文件结构

狂风中的少年 提交于 2020-01-16 05:12:09
class文件是一组以8bit字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑的排列在class文件中,中间没有添加任何分隔符。当遇到需要占用8bit字节以上的数据项时,会按照高位在前的方式分割成若干个8bit字节进行存储。 ClassFile结构 类型 名称 数量 u4 magic 1 u2 minor_version 1 u2 major_version 1 u2 constant_pool_count 1 cp_info constant_pool constant_pool_count-1 u2 access_flags 1 u2 this_class 1 u2 super_class 1 u2 interfaces_count 1 u2 interfaces interfaces_count u2 fields_count 1 field_info fields fields_count u2 methods_count 1 method_info methods methods_count u2 attributes_count 1 attribute_info attributes attributes_count MagicNumber 固定值: cafe babe 作用是确定这个文件是否为一个能被jvm所接受的Class文件

性能优化-JVM字节码

风格不统一 提交于 2020-01-16 03:27:26
2、JVM字节码 前面我们通过tomcat本身的参数以及jvm的参数对tomcat做了优化,其实要想将应用程 序跑的更快、效率更高,除了对tomcat容器以及jvm优化外,应用程序代码本身如果写的效率不高的,那么也是不行的,所以,对于程序本身的优化也就很重要了。 对于程序本身的优化,可以借鉴很多前辈们的经验,但是有些时候,在从源码角度方面 分析的话,不好鉴别出哪个效率高,如对字符串拼接的操作,是直接“+”号拼接效率高还是使用StringBuilder效率高? 这个时候,就需要通过查看编译好的class文件中字节码,就可以找到答案。 我们都知道,java编写应用,需要先通过javac命令编译成class文件,再通过jvm执行,jvm执行时是需要将class文件中的字节码载入到jvm进行运行的。 2.1、通过javap命令查看class文件的字节码内容 首先,看一个简单的Test1类的代码: 通过javap命令查看class文件中的字节码内容: 查看Test1.txt文件,内容如下: Classfile /F:/code/itcast‐jvm/itcast‐jvm‐ test/target/classes/cn/itcast/jvm/Test1.class Last modified 2018‐9‐27; size 577 bytes MD5 checksum

Java JVM 从方法调用的角度分析重载、重写的本质

女生的网名这么多〃 提交于 2020-01-16 01:12:10
专栏原创出处: github-源笔记文件 , github-源码 ,欢迎 Star,转载请附上原文出处链接和本声明。 Java JVM-虚拟机专栏系列笔记,系统性学习可访问个人复盘笔记-技术博客 Java JVM-虚拟机 一、前言 方法调用并不等同于方法中的代码被执行,Class 文件里面存储的都只是符号引用。 这个特性给 Java 带来了更强大的动态扩展能力,某些调用需要在类加载期间,某些到运行期间才能确定目标方法的直接引用。 本节内容基于字节码分析 Java 中重载和重写的实现过程。 二、方法调用字节码指令 在 Java 虚拟机支持以下 5 条方法调用字节码指令 invokestatic:用于调用静态方法 invokespecial:用于调用实例构造器 <init>() 方法、私有方法和父类中的方法 invokevirtual:用于调用所有的虚方法。 invokeinterface:用于调用接口方法,会在运行时再确定一个实现该接口的对象 invokedynamic:先在运行时动态解析出调用点限定符所引用的方法,然后再执行该方法。前面 4 条调用指令,分派逻辑都固化在 Java 虚拟机内部,而 invokedynamic 指令的分派逻辑是由用户设定的引导方法来决定的。 三、非虚方法与虚方法 非虚方法 有静态方法、私有方法、实例构造器、父类方法 4 种,再加上被 final

python第一天

时间秒杀一切 提交于 2020-01-15 16:53:33
Python简介: python的创始人吉多·范罗苏姆。1989年的圣诞期间为了打发时间,决定开发一个新的脚本解释程序,作为ABC语言的一种继承。 Python的种类: Cpython:cpython是python的官方版本,使用C语言实现,cpython实现会将源文件(.py文件)转换成字节码文件(pyc文件),然后运行在python虚拟机上。 Jython:Jython是java实现,jython会将python代码动态编译成java字节码,然后在JVM虚拟机上。 Ironpython:python的c#实现,Ironpython将python代码编译成c#字节码然后运行在CLR上 pypy: Python实现的Python,将Python的字节码字节码再编译成机器码。 Python环境: 1.下载安装包: https: / / www.python.org / downloads / 2.双击安装==>下一步==>下一步.....完成 3.环境变量的配置: 右键计算机 - - 》属性 - - 》高级系统设置 - - 》高级 - - 》环境变量 - - 》在第二个内容框中找到 变量名为Path 的一行,双击 - - > Python安装目录追加到变值值中,用 ; 分割 如:原来的值;C:\python27,切记前面有分号 Python入门 一、第一个python程序   #!

精讲 JVM架构体系介绍

随声附和 提交于 2020-01-15 11:39:37
每个Java开发人员都知道字节码将由JRE(Java Runtime Environment)执行。但是许多人并不知道JRE是Java虚拟机(JVM)的实现,它可以分析字节码,解释代码并执行它。作为开发人员,了解JVM的体系结构非常重要,因为它使我们能够更高效地编写代码。 通过优锐课的jvm分享,在本文中,我们将更深入地了解Java中的JVM体系结构以及JVM的不同组件。分享给大家参考学习。 什么是JVM? 虚拟机是物理机的软件实现。Java是根据WORA(可在任何地方写入一次)的概念开发的,可在VM上运行。编译器将Java文件编译为Java .class文件,然后将该.class文件输入到JVM中,JVM会加载并执行该类文件。下图是JVM的体系结构图。 JVM体系结构图 JVM如何工作? 如上面的架构图所示,JVM分为三个主要子系统: 1.类加载器子系统 2.运行时数据区 3.执行引擎 1.类加载器子系统 Java的动态类加载功能由类加载器子系统处理。它加载链接,并在运行时(而非编译时)首次引用类时初始化类文件。 1.1加载 类将由该组件加载。引导类装入器、扩展类装入器和应用程序类装入器是有助于实现它的三个类装入器。 1.引导程序类加载器–负责从引导类路径加载类,除了rt.jar此加载程序将获得最高优先级。 2.扩展类加载器–负责加载ext文件夹中的类 3.应用程序类加载器

IDEA编译器选择

[亡魂溺海] 提交于 2020-01-15 01:19:54
Project bytecode version: 针对项目字节码编译版本,一般选择的是当前项目主JDK版本 **Per-model bytecode version:**针对Project下各个modulede特殊需求单独设置不同的bytecode version ,前提必须装有对应的JDK版本。 maven中pom.xml文件,内容修改会自动更改为自己默认的编译版本。 来源: CSDN 作者: 浅笑不再 链接: https://blog.csdn.net/weixin_45339760/article/details/103977783

JVM之JVM的体系结构

故事扮演 提交于 2020-01-14 01:00:01
一、JDK的组成 JDK: JDK是Java开发工具包,是Sun Microsystems针对Java开发员的产品。JDK中包含JRE(在JDK的安装目录下有一个名为jre的目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib和起来就称为jre)和一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)。 Java Runtime Environment(JRE): 是运行基于Java语言编写的程序所不可缺少的运行环境。也是通过它,Java的开发者才得以将自己开发的程序发布到用户手中,让用户使用。JRE中包含了Java virtual machine(JVM),runtime class libraries和Java application launcher,这些是运行Java程序的必要组件。 JVM(java virtual machine): 就是我们常说的java虚拟机,它是整个java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行。 二、JVM的位置 JVM就是运行在操作系统之上的一个软件 三、JVM体系结构 JVM的组成: 类加载子系统 Class loader 运行时数据区 JVM

第十四章 类型信息

喜夏-厌秋 提交于 2020-01-13 22:20:28
第十四章 类型信息 运行时类型信息使得你可以在程序运行时发现和使用类型信息 它使你从只能在编译期执行面向类型的操作的禁锢中解脱了出来,并且可以使用某些非常强大的程序。对RTTI(Run-Time Type Identification——运行时类型识别)的需要,揭示了面向对象设计中许多有趣(并且复杂)的问题,同时也提出了如何组织程序得人问题。 Java是如何让我们在运行时识别对象和类的信息的。主要有两种方式: 一种是“传统的”RTTI,它假定我们在编译时已经知道了所有的类型; 另一种是“反射”机制,它允许我们在运行时发现和使用类的信息。 14.1 为什么需要RTTI 插入代码,J-P-313 在上述例子中,当把Shape对象放入List的数组时会向上转型。但在向上转型为Shape的时候也丢失了Shape对象的具体类型。对于数组而言,它们只是Shape类的对象。 当从数组中取回元素是,这种容器——实际上它将所有的事物都当做Object持有——会自动将结果转型会Shape。这是RTTI最基本的使用形式,因为在Java中,所有的类型转换都是在运行时进行正确性检查的。这也是RTTI名字的含义:在运行时,识别一个对象的类型。 多态机制 :你希望大部分代码尽可能少地了解对象的具体类型,而是只与对象家族中的一个通用表示打交道(上例中是基类Shape)。这样的代码会更容易编写,更容易读

Java--平台版本、跨平台、JVM、JDK、JRE

荒凉一梦 提交于 2020-01-13 13:10:21
Java2 平台版本 Java2 平台包括标准版( J2SE )、企业版( J2EE )和微缩版( J2ME )三个版 本 J2SE 包含那些构成 Java 语言核心的类。 J2EE 包含 J2SE 中的类,并且还包含用于开发 企 业级应用的类。 J2ME 包含 J2SE 中一部分类,用于消费类电子产品 的软件开发。 Java跨平台性原理 C/C++ 都会直接编译成对应平台(操作系统)机器码进行执行,如果要实现在不同平台执行,那么就要在不同的平台上使用不同编译器,重新进行编译,才可以执行 Java源程序在进行编译后形成与平台无关的字节码文件(.class) ,此文件不是用机器码文件不能直接在操作系统上执行,需要借助Java虚拟机进行解释执行,这就成就课Java的跨平台性。无论什么平台产生的都是与操作系统无关的字节码文件,通过JVM(Java虚拟机)中的不同操作系统的解释程序,解释成对应操作系统的可执行文件。(字节码文件只面向JVM,不面向任何的操作系系统)。 在java源程序编译成.class文件后,.class文件可以直接被JVM解释执行,也就是说.class文件编译一次,多平台执行。 JVM ? JDK ? JRE ? JVM 是 Java Virtual Machine ( Java 虚拟机 )的缩写, JVM 的主要工作是解释自己的指令集(即 字节码)到 CPU

python模块导入原理

生来就可爱ヽ(ⅴ<●) 提交于 2020-01-13 11:51:56
转自:http://blog.csdn.net/u012422440/article/details/41791433 今日在自学 Python ,借此机会,正好重新开始写博文,既可以巩固 python 的知识,也可顺便提高一下文笔。 一、python模块基础 言归正传,Python的模块是python语言中代码复用的最高级别,也是系统命名空间的的划分标准,也是供顶层文件(就是包含程序主要控制流程的部分)调用的工具库文件。实现模型其实很简单,任何一个python文件都可以当做模型通过import进行导入。而python的import与c或者c++的include的原理并不相同,举个例子就是: a.py: [python] view plain copy message= "test" def printer(): print( "test") b.py: [html] view plain copy import a a.printer() 通过import 就是可以让 b.py文件的顶层可以通过变量名b来获得所有的b.py在顶层定义的所有对象 ,比如message,printer。 二、import工作原理 之前提到python的import并不等同与c或者c++的include,因为import并不是把一个文件文本直接插入到另外一个文件中而已,在编译时进行