字节码

初识JVM内存模型

◇◆丶佛笑我妖孽 提交于 2019-12-05 09:12:54
计算机内存模型 在程序运行时,CPU通过访问主存获取数据,但随着CPU的快速发展,CPU访问速度越来越高,硬件无法满足CPU的条件下,大多内存加入了高速缓存机制,不同CPU都有对应的多级(一般为三)缓存,CPU取数时会先按照一级缓存-二级缓存-三级缓存-主存的顺序进行访问,提高了访问速度,但同时不同的CPU的缓存内的数据可能是不一样的,造成CPU与主存不能实现数据同步 JAVA内存模型 JAVA内存模型(Java Memory Model,JMM)是符合计算机内存模型规范的,通过设置内存屏障,屏蔽了不同硬件和操作系统的访问差异的,保证java程序在不同平台都能做到对内存的访问效果一致的机制及规范。 五大内存区域 1.程序计数器 每个线程都有程序计数器,程序计数器用来标识当前线程的程序字节码的行号,java方法运行时,程序计数器保存的是字节码文件的行号,native方法运行时,程序计数器的内容为空,不同的线程拥有其专属的程序计数器,为线程所私有 2.JAVA虚拟机栈 每个方法在运行时都会创建一个栈帧,包括存储局部变量表,操作栈,动态链接,方法出口等信息。每一个方法被调用的过程就对应一个栈帧在虚拟机栈中从入栈到出栈的过程。 JAVA虚拟机栈主要用来存储方法参数,方法内部的局部变量,编译期间加载的数据类型和返回地址类型,为线程所私有 3.本地方法栈 与JAVA虚拟机栈作用相似

动态代理的分类和各自的实现方式

余生颓废 提交于 2019-12-05 07:16:34
package com.hope.cglig;import com.hope.proxy.IProducer;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/** * 消费者 * @author newcityman * @date 2019/11/22 - 12:09 */public class Client { public static void main(String[] args) { final Producer producer = new Producer(); /** * 动态代理: * 特点:字节码随用随创建,随用随加载 * 作用:不修改源码的基础上对方法进行增强 * 分类: * 基于接口的动态代理 * 基于子类的动态代理 * 基于子类的动态代理 * 涉及的类:Enhancer * 提供者:第三方cglib库 * 如何创建代理对象: *

python运行过程

╄→гoц情女王★ 提交于 2019-12-05 06:59:16
当运行python时,会现在内存中生成PyCodeObject字节码,然后python解析器会调用字节码中命令到机器中执行。 当使用import调用模块时,通常python会把内存中的PyCodeObject保存到硬盘中生成pyc后缀的字节码文件。而普通运行python并不会生成pyc的文件。 在每次运行python的时候,都会先去查找本地的pyc文件,如果有就会直接调用字节码,当然找到文件后还会比对文件的修改时间,如果不是最新的pyc文件,还是会重新编译PyCodeObject。 来源: https://www.cnblogs.com/mowl/p/11912230.html

JVM学习(一)什么是JVM

廉价感情. 提交于 2019-12-05 06:59:12
一、 初识JVM(虚拟机)   JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。   引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。 二、 Java为什么是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程。 Java源文件被编译成能被Java虚拟机执行的字节码文件。 Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。 Java虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。 三、 Java内存结构 方法区和对是所有线程共享的内存区域;而java栈、本地方法栈和程序员计数器是运行是线程私有的内存区域。 Java堆(Heap)   是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。 方法区(Method Area)   与Java堆一样

java高频面试合集

亡梦爱人 提交于 2019-12-05 06:25:10
有关java的一般问题 1、什么是JVM(Java Virtual Machine)?为什么称Java为跨平台的编程语言? Java虚拟机(JVM)是可以 执行Java字节码 的虚拟机,每个Java源文件将被编译成字节码文件,然后在JVM中执行, 保证跨平台运行 2. JDK和JRE之间的差异是什么? 来源: https://www.cnblogs.com/huoxiansudi/p/11910243.html

Java动态编程初探——Javassist

时间秒杀一切 提交于 2019-12-05 06:21:18
最近需要通过配置生成代码,减少重复编码和维护成本。用到了一些动态的特性,和大家分享下心得。 我们常用到的动态特性主要是反射,在运行时查找对象属性、方法,修改作用域,通过方法名称调用方法等。在线的应用不会频繁使用反射,因为反射的性能开销较大。其实还有一种和反射一样强大的特性,但是开销却很低,它就是Javassit。 Javassit其实就是一个二方包,提供了运行时操作Java字节码的方法。大家都知道,Java代码编译完会生成.class文件,就是一堆字节码。JVM(准确说是JIT)会解释执行这些字节码(转换为机器码并执行),由于字节码的解释执行是在运行时进行的,那我们能否手工编写字节码,再由JVM执行呢?答案是肯定的,而Javassist就提供了一些方便的方法,让我们通过这些方法生成字节码。 类似字节码操作方法还有ASM。几种动态编程方法相比较,在性能上Javassist高于反射,但低于ASM,因为Javassist增加了一层抽象。在实现成本上Javassist和反射都很低,而ASM由于直接操作字节码,相比Javassist源码级别的api实现成本高很多。几个方法有自己的应用场景,比如Kryo使用的是ASM,追求性能的最大化。而NBeanCopyUtil采用的是Javassist,在对象拷贝的性能上也已经明显高于其他的库,并保持高易用性。实际项目中推荐先用Javassist实现原型

动态代理(基于类的动态代理)

感情迁移 提交于 2019-12-05 04:34:53
特点:字节码随用随创建,随用随加载 作用:不修改源码的基础上对方法进行增强 分类: 基于接口的动态代理 基于类的动态代理 基于类的动态代理: 涉及 的类:Enhance 提供者:第三方cglib库 如何创建代理对象:使用Enhance类中的create方法 创建代理对象的要求:被代理的类不能是最终类 create方法的参数: class :字节码 它是同于加载代理对象的字节码的,写的是被代理对象的类加载器。(代理谁就写谁的类加载器) Callback:用于提供增强的代码 它是让我们写如何代理。我们一般都是些一个该接口的实现类,通常情况下都是匿名内部类,但不是必须的。此接口的实现类谁用谁写。我们一般写的是该接口的子接口实现类:MethodInterceptor package com.xuefei.cglibProxy; //生产商 public class Producer{ public void saleProduct(float money) { System.out.println("拿到钱,给你商品"+money); } public void afterProduct(float money) { System.out.println("拿到钱给你售后"+money); } } package com.xuefei.cglibProxy; import com

在使用Javassist时遇到过一些问题

≡放荡痞女 提交于 2019-12-05 04:32:47
转自 http://www.cnblogs.com/hucn/p/3636912.html 1 因为tomcat和jboss使用的是独立的classloader,而Javassist是通过默认的classloader加载类,因此直接对tomcat context中定义的类做toClass会抛出 ClassCastException异常,可以用tomcat的classloader加载字节码。 CtClass cc = ...; Class c = cc.toClass(bean.getClass().getClassLoader()); 2 发现在简单的测试中可以load的类,在tomcat中无法load。这是因为,ClassPool.getDefault()查找的路径和底层的JVM路径。而tomcat中定义了多个classloader,因此额外的class路径需要注册到ClassPool中。 pool.insertClassPath( new ClassClassPath( this .getClass())); 3 我想在运行时修改类的一个方法,但是JVM是不允许动态的reload类定义的。一旦classloader加载了一个class,在运行时就不能重新加载这个class的另一个版本,调用toClass()会抛LinkageError。因此需要绕过这种方式定义全新的class

Java 基础笔记1 - java概述

£可爱£侵袭症+ 提交于 2019-12-05 03:11:59
简介: JAVA是一门面向对象的编程语言 1995有sun公司发布 java程序执行流程: xxxjava源文件, 经过编译器编译 产生字节码文件 字节码交给解释器 解释成当前平台的本地机器指令 名词概念 JVM,:是java虚拟机 jvm是实现跨平台的关键 JDK: java语言的软件开发工具包 两个重要组件: ​ javac,编译源文件 ​ java,运行编译后的java程序(.class作为后缀) JRE: Java运行环境 包括JVM和核心类库,如果只需要运行java软件安装JRE即可 如果要开发java程序,需要下载JDK 在JDK中包含了JRE 包含关系: JDK - > JRE - > JVM java平台分类 Java SE 标准版 主要用于桌面程序 Java EE 企业版 包括web开发相关的技术 Java ME 移动版 用于移动设备开发,目前已被淘汰 执行流程 1.编写源代码 xxx.java coding... 2.编译代码为class字节码 javac 3.执行字节码以运行程序 java (注意不需要加.class后缀) 环境搭建 1.官网下载JDK并安装 2.配置环境变量 windows:高级设置中添加 ,重启CMD mac:当前用户HOME下的 .bash_profile java程序的结构 JRE显示了当前项目使用的运行环境

反射

泪湿孤枕 提交于 2019-12-05 03:10:40
反射:框架设计的灵魂   框架:半成品软件。可以在框架的基础上进行软件开发,简化代码   反射:将类的各个组成部分封装为其他对象,即反射机制;     好处:在程序运行过程中可以操作这些对象         可以降低程序的耦合性,提高程序的可扩展性 获取class对象的方式: 1class.forname("全类名"):将字节码文件加载进内存,返回class对象 多用于配置we年,将类名定义在配置文件中,读取文件,加载类 2通过类名的class属性来获取 多用于参数传递 3对象.getClass()方法,在object类中获取; 多用于对象的获取字节码文件; 结论:同一个字节码文件(*。class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个; 来源: https://www.cnblogs.com/Damocless/p/11901431.html