字节码

JDK动态代理实现机制

故事扮演 提交于 2020-02-11 09:41:45
===========================================     原文链接: JDK动态代理实现机制 转载请注明出处! =========================================== 本文只对JDK动态代理的底层实现进行分析,如需了解代理模式和动态代理的使用请移步: 设计模式—代理模式 动态代理的两种实现方式(JDK/Cglib) 在读代码之前先清楚两个概念:   1、Class类存储的是类的所有信息,包括类的所有方法、属性、实现接口等。每个类对应一个Class对象(单例),Class对象是由classLoader加载出来的,使用双亲委派模型来保证class只会被加载一次。   2、classLoader在加载类的时候不管class文件是从哪里来的,无论是从.class文件、网络、数据库类加载器都不关心。他只关心给他的class二进制流是不是能够通过校验。 说明:以下测试代码和 动态代理的两种实现方式(JDK/Cglib) 相同 使用JDK动态代理需要实现 InvocationHandler 接口,同时实现invoke()方法。 package com.zpj.proxy.jdk; import java.lang.reflect.InvocationHandler; import java.lang.reflect

JVM内存模型

寵の児 提交于 2020-02-10 00:57:43
个人博客 http://www.milovetingting.cn JVM内存模型 前言 本文为学习Java相关知识所作笔记,参考以下资料: https://github.com/Snailclimb/JavaGuide ,感谢原作者的分享! 基本概念 JVM是可运行Java代码的虚拟计算机,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收器、堆和一个存储方法域。JVM运行在操作系统之上,它与硬件没有直接交互。 Java源文件,通过编译器,能够生产相应的class文件,也就是字节码文件,字节码文件通过Java虚拟机中的解释器,编译成特定机器上的机器码。 Java源文件-->编译器-->字节码文件 字节码文件-->JVM-->机器码 每一种平台的解释器是不同的,但是实现的虚拟机是相同的,这也就是 Java 为什么能够跨平台的原因了 ,当一个程序从开始运行,这时虚拟机就开始实例化了,多个程序启动就会存在多个虚拟机实例。程序退出或者关闭,则虚拟机实例消亡,多个虚拟机实例之间数据不能共享。 线程 这里所说的线程指程序执行过程中的一个线程实体。JVM 允许一个应用并发执行多个线程。Hotspot JVM 中的 Java 线程与原生操作系统线程有直接的映射关系。当线程本地存储、缓冲区分配、同步对象、栈、程序计数器等准备好以后,就会创建一个操作系统原生线程。Java 线程结束

Java基础 -1

跟風遠走 提交于 2020-02-09 23:08:48
首先写一个 Hello.txt 的文本 public class Hello { public static void main(String args[]) { System.out.println("Hello World !") ; } } 改为 .java 后缀的 然后 对源代码程序进行 编译:javac Hello.java 会出现Hello.class的字节码文件 利用JVM进行编译 编译出一套与平台无关的字节码文件(hello.class) 在JVM进行程序的解释执行 java Hello 解释的就是字节码文件 字节码文件的后缀 不需要编写的 我们经常把 可以省略不写的 用[] 括起来 在java程序开发中最基础的单元是类 所有程序都必须封装在类中执行 [public] class 类名称 {} 你有没有想过为啥要加 public 经过对比 你就会明白了 第一个代码 中 只将Hello 改为 HelloWorld 后 编译就会报错 显然是因为HelloWorld的名字与文件名字不同 于是把第一个代码中的public弃掉 编译通过 生成了 HelloWorld.class的文件 编译执行的也是HelloWorld文件 此时文件名称依然是Hello 得出 public class 类名称 {} 类名称必须与文件名称保持一致 class 类名称 {}

Python基础复盘_01

亡梦爱人 提交于 2020-02-09 12:49:56
1.什么是机器码?什么是字节码? 机器码(machine code) ,学名机器语言指令,有时也被称为原生码(native code),是电脑CPU可以直接解读的数据。 通常意义上的理解,机器码就是可以计算机直接执行,并且执行速度最快的代码。 字节码(Bytecode) ,是一种包含执行程序、由一序列 op 代码/数据对 组成的二进制文件。字节码是一种中间码,它比机器码更抽象,需要直译器转译后才能成为机器码的中间代码。 通常情况下它是已经经过编译,但与特定机器码无关。字节码通常不像源码一样可以让人阅读,而是编码后的数值常量、引用、指令等构成的序列。 2.Python-->Python 解释器 Python的软件实际是Python 的解释器。 3.Pyhton3与Python2的区别 3.1核心类差异 Python3对Unicode字符的原生支持 Python2中使用 ASCII 码作为默认编码方式导致string有两种类型str和unicode,Python3只支持unicode的string。python2和python3字节和字符对应关系为: 编码&字符串 字符串: py2: unicode v = u"root" 本质上用unicode存储(万国码) (str/bytes) v = "root" 本质用字节存储 py3: str v = "root"

2. Java程序的运行机制

 ̄綄美尐妖づ 提交于 2020-02-09 08:20:26
一、完成一个Java程序的流程:编辑Java源代码→编译Java程序→运行Java程序 1. 在记事本中编写Java程序,然后保存为 .java类型文件(Java源文件) 2. 使用javac命令将源文件编译成 字节码文件(*.class文件) 3. 使用java命令解释执行字节码文件 【示例】 1. 在路径D:\下创建一个HelloWorld.java文件,并编写如下代码 public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } } 2. 在命令行窗口先切换到路径D:\,然后输入“javac [-d .] HelloWorld.java”命令 补:javac命令的用法为“ javac -d destdir srcFile ”,其中“-d destdir”指定编译生成的字节码文件的存放路径,而srcFile则是Java源文件所在的位置。 3. 在命令行窗口进入HelloWorld.class所在的位置,然后输入“java HelloWorld”命令 补:java命令的用法为“ java Java类名 ”,java命令后的参数是Java类名,而不是字节码文件的文件名,也不是Java源文件名。 二、Java程序的运行原理

java的运行机制, JVM

我们两清 提交于 2020-02-09 07:02:45
java程序的运行机制 java语言比较特殊,由java语言编写的程序需要经过编译步骤,但这个编译步骤并不会生成特定平台的字节码,而是生成一种与平台无关的字节码(即*.class文件)。然,这中字节码并不是可执行的,必须使用java解释器来解释执行。因此我们认为,java语言是编译型语言,也是解释型语言   java程序的执行过程必须经过先编译,后解释的步骤。(在dos命令中,用javac,进行编译,用关键字java解释执行) JVM(Java Virtual Machine) Java语言里负责解释执行字节码文件的是Java虚拟机,即JVM。所有平台上的JVM向编译器提供相同的编程接口,而编译器只需要面向虚拟机,生成虚拟机能理解的代码,然后由虚拟机来解释执行。在一些虚拟机的实现中,还会将虚拟机代码转换成特定系统的机器码执行,从而提高执行效率。 不同平台上的JVM是不同的,当使用java编译器编译java程序时,生成的是与平台无关的字节码,这些字节码不面向任何具体平台,只面向JVM。JVM是java程序跨平台的关键部分。 开发java的准备       关于JDK JDK提供了开发java应用程序的开发包,,它提供了编译,运行java程序所需的各种工具和资源,包括java编译器,java运行时环境,以及常用的java类库等。    JRE,与jvm的关系     JRE

Java运行时数据区域

落爺英雄遲暮 提交于 2020-02-09 00:00:07
   Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自不同的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。根据《Java虚拟机规范(Java SE 7版)》的规定,Java虚拟机所管理的内存将会包括以下几个运行时数据区域: 1. 程序计数器   程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。   由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。   如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的事Native方法

java运行机制详细

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

Java的运行机制

生来就可爱ヽ(ⅴ<●) 提交于 2020-02-08 23:08:40
1、Java程序必须经过编写、编译、运行三个步骤。 编写:输入代码,形成后缀名为.java的Java源文件; 编译:使用Java编译器对源文件进行错误排查的过程,编译后生成后缀名为.class的字节码文件(二进制文件); 运行:使用Java解释器将字节码文件翻译成具体硬件环境和操作系统平台的机器代码,执行并显示结果。 Java程序不能直接运行在现有的系统平台上,必须运行在Java虚拟机(JVM)上。JVM是运行Java程序的软件环境,Java解释器就是JVM的一部分。在运行Java程序时,首先会启动JVM,然后由它来负责执行Java的字节码,并且Java字节码只能运行于JVM上。这样利用JVM就可以把Java字节码程序与具体的硬件平台及操作系统环境分隔开来,只要在不同的计算机上安装针对特定具体平台的JVM,Java程序就可以运行。JVM把这种不同软硬件平台的具体差别隐藏起来,从而实现了真正的二进制代码级跨平台移植。 注:JAVA程序通过JVM可以实现跨平台特性,但JVM是不跨平台的,也就是说,不同操作系统上的JVM是不同的。 2、Java代码的注释 单行注释 // 多行注释 /* */ 文档注释/** */ 3、命名规则 类名:首字母大写,其后每一个单词的首字母都大写; 方法名、属性名、变量名和对象名:首字母小写,其后每个单词的首字母大写; 关键字、包名:全部小写; 常量:全部大写

【JVM虚拟机】(9)-- JVM是如何处理异常的

試著忘記壹切 提交于 2020-02-08 23:07:20
JVM是如何处理异常的 上篇博客我们简单说过 异常信息是存放在属性表集合中的Code属性表里 ,那么这篇博客就单独讲Code属性表中的exception_table。 在讲之前我们先思考两个问题? 1、为什么捕获异常会较大的性能消耗? 2、为什么finally中的代码会永远执行? 接下来会从JVM虚拟机的角度来解答这两个问题。 一、概念 1、JVM是如何捕获异常的? 1、编译而成的字节码中,每个方法都附带一个 异常表 。 2、异常表中每一个条目代表一个 异常处理器 3、触发异常时,JVM会遍历异常表,比较触发异常的字节码的索引值是否在异常处理器的 from指针到to指针 的范围内。 4、范围匹配后,会去比较 异常类型和异常处理器中的type是否相同 。 5、类型匹配后,会跳转到 target指针所指向的字节码 (catch代码块的开始位置) 6、如果没有匹配到异常处理器,会弹出当前方法对应的 Java栈帧 ,并对调用者重复上述操作。 2、什么是异常表? 1. 每个方法都附带一个异常表 2. 异常表中每一个条目, 就是一个异常处理器 异常表如下: 3、什么是异常处理器?其组成部分有哪些? 1、异常处理器由from指针、to指针、target指针,以及所捕获的异常类型所构成(type)。 2、这些指针的数值就是字节码的索引(bytecode index, bci),可以直接去定位字节码