字节码

JVM优化之逃逸分析与分配消除

拥有回忆 提交于 2019-11-30 03:44:01
要了解逃逸分析背后的基本原理,我们先来看下这段有问题的C代码——当然这个是没法用Java来写的: 这段C代码在栈上创建了一个int类型的变量,然后把它的指针作为函数的返回值返回了。这样做是有问题的,因为当get the int()函数返回的时候,int所在的栈帧就已经被销毁了,后面你再去访问这个地址的话,就不知道里面存储的到底是什么了。 Java平台设计的一个主要目标就是要消除这种类型的bug。从设计上,JVM就不具备这种低级的“根据位置索引来读内存”的能力。这类操作对应的Java字节码是putfield和getfield。 来看下这段Java代码: 这段代码创建了一亿对随机大小的矩形,并去计算有多少对是大小一样的。每次迭代都会创建一对新的矩形。你可能会认为main方法里会创建2亿个Rect对象:一亿个r1,一亿个r2。 不过,如果某个对象只是在方法内部创建并使用的话——也就是说,它不会传递到另一个方法中或者作为返回值返回——那么运行时程序就还能做得更聪明一些。你可以说这个对象是没有逃逸出去的,因此运行时(其实就是JIT编译器)做的这个分析又叫做逃逸分析。 如果一个对象没有逃逸出去,那也就是说JVM可以针对这个对象做一些类似“栈自动分配”的事情。在这个例子当中,这个对象不会从堆上分配空间,因此它也不需要垃圾回收器来回收。一旦使用这个“栈分配(stack-allocated)

Servlet中乱码的处理及理解

試著忘記壹切 提交于 2019-11-30 03:29:31
jsp传值到servlet中,分为set和post提交方式,在servlet中有doGet()\doPost()方法 1.使用post方式提交的,比较简单,有两种解决办法   ①.请求和响应乱码 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //处理响应乱码 response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); String userName = request.getParameter("userName"); //处理请求乱码的第一种方式,只对post有效 request.setCharacterEncoding("utf-8"); out.write("用户名:"+userName+"</br>"); }   ②.把jsp页面传过来的值,转成字节码,再把字节码转成utf-8的字符串 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws

初识Python

ⅰ亾dé卋堺 提交于 2019-11-30 02:35:33
Python简介 Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum)。1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承。 最新的TIOBE排行榜,Python赶超PHP占据第五!!! 由上图可见,Python整体呈上升趋势,反映出Python应用越来越广泛并且也逐渐得到业内的认可!!! Python可以应用于众多领域,如:数据分析、组件集成、网络服务、图像处理、数值计算和科学计算等众多领域。目前业内几乎所有大中型互联网企业都在使用Python,如:Youtube、Dropbox、BT、Quora(中国知乎)、豆瓣、知乎、Google、Yahoo!、Facebook、NASA、百度、腾讯、汽车之家、美团等。互联网公司广泛使用Python来做的事一般有:自动化运维、自动化测试、大数据分析、爬虫、Web 等。 注视:上述重点字体表示该公司主要使用Python语言开发 为什么是Python而不是其他语言? C 和 Python、Java、C#等 C语言: 代码编译得到 机器码 ,机器码在处理器上直接执行,每一条指令控制CPU工作 其他语言: 代码编译得到 字节码 ,虚拟机执行字节码并转换成机器码再后在处理器上执行 Python 和 C Python这门语言是由C开发而来  

动态代理机制详解(JDK 和CGLIB,Javassist,ASM)

柔情痞子 提交于 2019-11-30 01:12:13
在运行时期可以按照Java虚拟机规范对class文件的组织规则生成对应的二进制字节码。当前有很多开源框架可以完成这些功能,如ASM,Javassist。 动态代理机制详解(JDK 和CGLIB,Javassist,ASM) ASM,Javassist:在代码里生成字节码,并动态地加载成class对象、创建实例。即在运行期系统中,遵循Java编译系统组织.class文件的格式和结构,生成相应的二进制数据,然后再把这个二进制数据加载转换成对应的类,这样,就完成了在代码中,动态创建一个类的能力了。 ASM: ASM 是一个 Java 字节码操控框架。它能够以二进制形式修改已有类或者动态生成类。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。ASM 从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类。 不过ASM在创建class字节码的过程中,操纵的级别是底层JVM的汇编指令级别,这要求ASM使用者要对class组织结构和JVM汇编指令有一定的了解。 Javassist:直接使用java编码的形式,不需要了解 虚拟机 指令 JDK动态代理,CGLIB:不用写 JVM的汇编指令和类的 java编码,通过实现接口和继承的方式创建。 JDK动态代理: 某个类必须有实现的接口

关于java字节码框架ASM的学习

ぃ、小莉子 提交于 2019-11-30 01:12:01
一、什么是ASM   ASM是一个java字节码操纵框架,它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类。   使用ASM框架需要导入asm的jar包, 下载链接: asm-3.2.jar 。   二、如何使用ASM   ASM框架中的核心类有以下几个:   ① ClassReader:该类用来解析编译过的class字节码文件。   ② ClassWriter:该类用来重新构建编译后的类,比如说修改类名、属性以及方法,甚至可以生成新的类的字节码文件。   ③ ClassAdapter:该类也实现了ClassVisitor接口,它将对它的方法调用委托给另一个ClassVisitor对象。   示例1.通过asm生成类的字节码 1 package com.asm3; 2 3 import java.io.File; 4 import java.io.FileNotFoundException; 5 import java.io

Java初步

时光总嘲笑我的痴心妄想 提交于 2019-11-29 22:46:04
Java的核心优势:跨平台 Java SE:标准版 Java EE:企业级 Java ME:微型版 源文件(*.java)→编译器→字节码文件(*.class)→(类装载器→字节码校验器→解释器)【JRE】→系统平台 win10用javac无法编译,应用javac -encoding UTF-8 *.java Java对大小写敏感 public是访问修饰符 class是类,Java是面向对象语言,代码必须在类里面 一个源文件只能声明一个public类,其他类个数不限,但是文件名必须和定义的public类名相同,且以.java为扩展名 每个类生成一个独立的字节码文件,以.class为扩展名 main方法是Java的入口方法 标识符可以是数字,字母,下划线和$的任意组合,但是不可以用数字开头 表示类名的标识符,每个单词的首字母大写,方法名和变量名第一个单词小写,从第二个单词开始首字母大写(驼峰原则) 变量的本质:可操作的存储空间 变量的要素:变量名,变量类型,作用域 变量分为 局部变量,成员变量和静态变量 局部变量在使用前必须先声明、初始化(赋初值)才能使用,从属于语句块或者方法 成员变量从属于对象,会自动被初始化 静态变量从属于类 常量通常指一个固定的值,利用关键字final来定义 字面常量和符号常量(PI),全部大写和下划线组成 long长整型类型赋值要加后缀L float 4字节

Spring 源码分析 spring-core

老子叫甜甜 提交于 2019-11-29 21:01:33
先来看下 spring-core 的包结构 总共有6个模块,分别是 asm、cglib、core、lang、objenesis、util asm包: 用来操作字节码,动态生成类或者增强既有类的功能。主要包含以下这些类。详细功能。 https://www.ibm.com/developerworks/cn/java/j-lo-asm30/index.html cglib包: 来源: https://blog.csdn.net/likunpeng6656201/article/details/100918707

Spring之AOP原理_动态代理

坚强是说给别人听的谎言 提交于 2019-11-29 19:46:13
面向方面编程( Aspect Oriented Programming ,简称 AOP )是一种声明式编程( Declarative Programming )。声明式编程是和命令式编程( Imperative Programming )相对的概念。我们平时使用的编程语言,比如 C++ 、 Java 、 Ruby 、 Python 等,都属命令式编程。命令式编程的意思是,程序员需要一步步写清楚程序需要如何做什么( How to do What )。声明式编程的意思是,程序员不需要一步步告诉程序如何做,只需要告诉程序在哪些地方做什么( Where to do What )。比起命令式编程来,声明式编程是在一个更高的层次上编程。声明式编程语言是更高级的语言。声明式编程通常处理一些总结性、总览性的工作,不适合做顺序相关的细节相关的底层工作。 如果说命令式编程是拼杀在第一线的基层工作人员,声明式编程就是总设计师、规则制定者。声明式编程语言的概念,和领域专用语言( Domain Specific Language ,简称 DSL )的概念有相通之处。 DSL 主要是指一些对应专门领域的高层编程语言,和通用编程语言的概念相对。 DSL 对应的专门领域( Domain )一般比较狭窄,或者对应于某个行业,或者对应于某一类具体应用程序,比如数据库等。 最常见的 DSL

Python如何运行程序

混江龙づ霸主 提交于 2019-11-29 19:18:43
程序执行的标准流程 Python安装在机器上,它包含一个解释器和支持的库。Python程序开始执行之前不需要预编译和连接,大大缩短开发周期。 字节码编译 当Python运行脚本时,第一步需要将脚本编译成“字节码”,字节码是源代码底层的、与平台无关的表现形式,扩展名为“.py”的脚本源文件编译成扩展名为“.pyc”字节码文件,此过程对程序员是不可见的(即透明的)。如果源文件没有被修改,下一次运行程序时将自动加载.pyc字节码文件。 Python虚拟机(PVM) 编译后的字节码文件被发送到Python虚拟机,PVM解释字节码并运行字节码指令,也就是说PVM是实际运行脚本的组件。由于运行的是字节码而不是像C/C++那样运行二进制代码,所以Python的执行效率比C/C++低。 值得注意的是:在一些需要高执行速度的领域,如:数值计算、动画,通过分离一部分需要优化执行速度的应用。将其转换为编译好的扩展,能够到达想要的运行效果。比如NumPy,一个Python的数值计算扩展。 Python的实现 Python语言主要有3种实现方式(CPython、 Jython、 IronPython) CPython CPython是原始的、标准的Python实现方式,从官网(http://www.python.org)下载的Python就是CPython,由ANSI C语言编写而成

Class文件和JVM的恩怨情仇

馋奶兔 提交于 2019-11-29 19:12:03
类的加载时机 现在我们例子中生成的两个.class文件都会直接被加载到JVM中吗?? 虚拟机规范则是严格规定了有且只有5种情况必须立即对类进行“初始化”(class文件加载到JVM中): 创建类的实例(new 的方式)。访问某个类或接口的静态变量,或者对该静态变量赋值,调用类的静态方法 反射的方式 初始化某个类的子类,则其父类也会被初始化 Java虚拟机启动时被标明为启动类的类,直接使用java.exe命令来运行某个主类(包含main方法的那个类) 当使用JDK1.7的动态语言支持时(....) 所以说: Java类的加载是动态的,它并不会一次性将所有类全部加载后再运行,而是保证程序运行的基础类(像是基类)完全加载到jvm中,至于其他类,则在需要的时候才加载。这当然就是为了节省内存开销。 如何将类加载到jvm class文件是通过类的加载器装载到jvm中的! Java默认有三种类加载器: 各个加载器的工作责任: 1)Bootstrap ClassLoader:负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++实现,不是ClassLoader子类 2)Extension ClassLoader:负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目录下的jar包 3