字节码

字节码与机器码

匿名 (未验证) 提交于 2019-12-02 23:40:02
字节码与机器码 字节码 是一种包含执行程序、由一序列 op代码/数据对 组成的二进制文件。 是一种中间码,它比机器码更抽象,需要直译器转译后才能成为机器码的中间代码。 是编码后的数值常量、引用、指令等构成的序列。 机器码 是电脑的CPU可直接解读的数据,可以直接执行,并且是执行速度最快的代码。 转换关系 通常是有编译器将源码编译成字节码,然后虚拟机器将字节码转译为机器码 使用 通常是跨平台时使用,这样能够时代吗很好的在其他平台上运行。 参考链接 https://www.cnblogs.com/qiumingcheng/p/5400265.html

阿里开源线上应用调试利器 Arthas的背后

匿名 (未验证) 提交于 2019-12-02 23:40:02
Arthas是一个功能非常强大的诊断工具,功能点很多,例如:jvm信息、线程信息、搜索类中的方法、跟踪代码执行、观测方法的入参和返回参数等等。 Instrumentation把 Java的instrument 功能从本地代码中解放出来,使之可以用Java代码的方式解决问题。使用 Instrumentation,开发者可以构建一个独立于应用程序的代理程序(Agent),用来监测和协助运行在 JVM 上的程序,甚至能够替换和修改某些类的定义。Instrumentation是Java SE 5中的新特性。在SE 5中只能在运行前进行加载,在SE 6中实现能够在运行时加载。例如java -javaagent: agent.jar -jar agent-demo.jar ASM是一个java字节码操纵框架,它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类。asm字节码增强技术主要是用来反射的时候提升性能的,如果单纯用jdk的反射调用,性能是非常低下的

代码编译时JDK版本和运行时JDK版本不一致启动项目报错

匿名 (未验证) 提交于 2019-12-02 23:34:01
java编译: java编译就是 .java文件变成.class 文件的过程,这个过程一般在我们常用的编译器中进行,例如Ecliplse和IDEA等:下面以IDEA举例: 执行上述编译使用的JDK版本就是我们不同编译器所设置的java版本: java运行: java运行就是我们编译得到的字节码文件(就是.class文件)在安装了Java运行环境(JVM)的计算机上运行,此时使用的的JDK版本就是我们配置的JAVA_HOME对应的java版本。我们可以通过在命令行执行:java -version来查看当前计算机上的java版本 五月 22, 2019 7:05:35 上午 org.apache.tomcat.util.modeler.BaseModelMBean invoke 严重: Exception invoking method createStandardContext javax.management.RuntimeOperationsException: Exception invoking method manageApp at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:305) at com.sun.jmx.interceptor

java程序的运行机制详细分析

偶尔善良 提交于 2019-12-02 23:32:03
转自:http://hi.baidu.com/suny_duan/blog/item/074f9afb09f08c9b58ee901b.html JVM(Java虚拟机)一种用于计算设备的规范,可用不同的方式(软件或硬件)加以实现。编译虚拟机的指令集与编译微处理器的指令集非常类似。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 Java虚拟机(JVM)是可运行Java代码的假想计算机。只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该系统上运行。 1.为什么要使用Java虚拟机 Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编 译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用模式Java虚拟机屏蔽了与具体平台 相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字 节码时,把字节码解释成具体平台上的机器指令执行。 Java运行机制 Java程序的运行必须经过 编写 、 编译 、 运行 三个步骤。 编写是指在Java开发环境中进行程序代码的输入

Sping:AOP-cglib字节码增强

匿名 (未验证) 提交于 2019-12-02 23:32:01
没有接口,只有实现类。 采用字节码增强框架 cglib,在运行时 创建目标类的子类,从而对目标类进行增强。 导入spring的核心包 上代码: package com.fjs.Services; import org.springframework.cglib.proxy.Enhancer; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /* cglib 字节码增强 */ public class MyBeanFactory { public static Services createService2(){ //目标类 final Services service=new ServicesImpl(); //切面类 final MyAspect aspect=new MyAspect(); //cglib核心类 //创建增强对象 Enhancer enhancer=new Enhancer();

JVM基础知识(二)

匿名 (未验证) 提交于 2019-12-02 23:32:01
通过将代码编译为字节码(Byte Code),而后虚拟机根据字节码执行具体动作,Java虚拟机实现了平台无关性与语言无关性。 编译后的字节码为Class文件格式(其实不一定是真正的文件) Class文件格式: 一、开头为魔数+Class文件版本号

反射

匿名 (未验证) 提交于 2019-12-02 23:32:01
1:java开发工具可以帮助我们将代码编译为class字节码 2:类加载器加载class字节码,将字节码里面的指令放到内存执行,并且将数据动态分配到jvm内存呢模型中, 3:jvm'的分区 类的加载流程: 1:雷电加载指定就是将class文件找中的二进制数据读取到内存中。类、方法、常量、静态内容放到方法区。 2:但是要在堆中创建一个class对象,用开封装存储在方法区的数据结构 3:类的加载最终结果就是在对中产生了一个class对象,当前对象提供了访问方法区内容的接口 类加载器加载class文件,加载class文件有哪些方式: 1:直接从本地系统读取,直接加载 2:通过网络路径下载 3:zip,jar包读取文档中的class文件 4,从某些数据库中获取class文件 5:将java原文件动态编译成class文件 类的生命周期 类的加载过程: 加载、验证、准备、解析、初始化 加载:查找并加载类的二进制的数据 1:通过全限定名获取定义的而进制数据 2:将字节流所代表的静态储存内容放入方法区 3:在java堆中生成一个代表当前对象的java.lang.Class对象,作为方法区的访问接口,整个类的生命周期中,最容易控制的就是当前阶段,你可以自己定义类加载器来加载数据 验证:验证的主要目的是确保被加载类的正确性 验证主要内容是验证你的class文件的信息中是否符合java虚拟机加载的要求

详解 JVM 字节码(2)

匿名 (未验证) 提交于 2019-12-02 23:32:01
jvm 什么是字节码,为什么需要字节码 编译 JVM 编译成机器码, 我们看一看 Java 编译过程 java 源码 编译为 class 文件 JVM 接收字节码文件后对其进行校验 验证字节码文件正确性然后通过类加载器加载生成 class 类来运行 【图】 为什么学习字节码? 大家都知道 java 文件编译后为二进制的字节码文件可以被 JVM 读懂,学习好字节码文件可以让我们对 Java 这门语言有深入了解。只要遵循 JVM 规范你就可以创建出自己语言。可以反编译一些第三方库。 java 规范分为两种 java 语言本身的规范 JVM 的规范。字节码属于 JVM 规范。JVM 只是关心字节码 这里我们整个字节码分析都会以整个类文件,通过读整个类编译后的字节码来学习字节码。 package com.zidea; public class Tut { private String title = "basic"; private int courses = 10; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public int getCourses() { return courses; } public void

详解 JVM 字节码 (1)

匿名 (未验证) 提交于 2019-12-02 23:32:01
在开始分析 class 字节码前我们先补一补一些基础知识,帮助我们更好地了解 jvm 是如何执行字节码的。大家可能都知道 JVM 是操作栈, CLR常用简写词语,CLR是公共语言运行库(Common Language Runtime)和Java 虚拟机一样也是一个运行时环境,它负责资源管理(内存管理和垃圾收集等),并保证应用和底层操作系统之间必要的分离。CLR存在两种不同的翻译名称:公共语言运行库和公共语言运行时。 栈虚拟机 操作数栈持有操作数 操作数可以入栈或出栈进行操作 栈的大小是由每一个方法显式确定的 public class HelloWorld { public static void main(String[] args) { System.out.println("hello world"); } } 这里我们写一个简单的 HelloWorld 代码,执行效果是在控制台输出 hello world 执行顺序 我们用查看字节码工具来看一下,main 方法执行那些指令将我们 hello world 进行输出,这里大家只是简单了解就行,随后给大家分享如何查看和分析字节码。 操作符执行栈 首先将 System.out.Print 压入栈 然后将字符串“hello world ” 入栈 invokevitual 调用将调用 print 命令将 hello world 进行输出。

Java应用程序运行机制

帅比萌擦擦* 提交于 2019-12-02 23:31:51
Java程序运行机制 计算机高级编程语言类型有:编译型和解释型 Java是两种语言的结合(编译命令:javac.exe 解释命令:java.exe) javac: 负责的是编译的部分,当执行javac时,会启动java的编译器程序。对指定扩展名的.java文件进行编译。 生成了jvm可以识别的字节码文件,也就是class文件,也就是java的运行程序。 java: 负责运行的部分,会启动jvm,加载运行时所需的类库,并对class文件进行执行。 一个文件要被执行,必须要有一个执行的起始点,这个起始点就是main函数。 Java程序组成:Java源文件、字节码文件、机器码指令。 Java 源程序与编译型运行区别: 两种核心机制 Java虚拟机(Java Virtal Machine) JVM是一个可以执行 Java 字节码的虚拟机进程,或者可以说是一个虚拟的计算机,具有指令集并使用不同的存储区域,负责执行指令,管理数据、内存、寄存器。 Java 源文件被编译成能被Java 虚拟机执行的字节码文件。 Java虚拟机机制屏蔽了底层运行平台的差别,实现了“一次编译,到处运行”。 Java 被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java 虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。