字节码

JavaScript 引擎 V8 执行流程概述

核能气质少年 提交于 2019-12-23 18:15:46
本文首发于 vivo互联网技术 微信公众号 链接: https://mp.weixin.qq.com/s/t__Jqzg1rbTlsCHXKMwh6A 作者:赖勇高 本文主要讲解的是V8的技术,是V8的入门篇,主要目的是了解V8的内部机制,希望对前端,快应用,浏览器,以及nodejs同学有些帮助。这里不涉及到如何编写优秀的前端,只是对JS内部引擎技术的讲解。 一、V8来源 V8的名字来源于汽车的“V型8缸发动机”(V8发动机)。V8发动机主要是美国发展起来,因为马力十足而广为人知。V8引擎的命名是Google向用户展示它是一款强力并且高速的JavaScript引擎。 V8未诞生之前,早期主流的JavaScript引擎是JavaScriptCore引擎。JavaScriptCore是主要服务于Webkit浏览器内核,他们都是由苹果公司开发并开源出来。据说Google是不满意JavaScriptCore和Webkit的开发速度和运行速度,Google另起炉灶开发全新的JavaScript引擎和浏览器内核引擎,所以诞生了V8和Chromium两大引擎,到现在已经是最受欢迎的浏览器相关软件。 二、V8的服务对象 V8是依托Chrome发展起来的,后面确不局限于浏览器内核。发展至今V8应用于很多场景,例如流行的nodejs,weex,快应用,早期的RN。 三、V8的早期架构

V8 是怎么跑起来的 —— V8 的 JavaScript 执行管道

帅比萌擦擦* 提交于 2019-12-23 10:21:26
文章创作于 2019-11-08,2019-12-20 迁移至此。 作者有话说 “V8 是怎么跑起来的” 系列是我学习 V8 过程中的总结。从一年前正式成为前端工程师开始,我便有意识地了解和学习 V8。我也发现,在技术社区中鲜有内容新鲜的、原创度高的中文资料,于是开始将我学习过程中的总结分享出来。 由于工作繁忙,我已经半年没有更新博客。这个系列的引子是 4 月写的一篇 《V8 是怎么跑起来的 —— V8 中的对象表示》 ,我们通过使用 Chrome DevTools 验证的方式介绍了 V8 中的对象表示。 本文是这个系列真正意义的第一篇文章。文章的定位是这个系列的大纲,将按照 JavaScript 在 V8 中的执行流程,顺序介绍每一步的操作,并澄清一个社区中流传甚广的 “错误”。本文不会过于深究其中的细节(后续篇章将展开),您可以在评论中留下您想了解 V8 引擎的部分,也许下一篇选题会采纳并优先介绍。 祝阅读愉快。 1. 为什么是 V8 Any application that can be written in JavaScript, will eventually be written in JavaScript. 相信很多的朋友都听过前端界的一个著名定律,叫做 Atwood’s Law 。2007 年,Jeff Atwood 提出 “所有可以用 JavaScript

ASM 系列详细教程-01-ASM 入门简介

孤人 提交于 2019-12-23 07:25:03
ASM ASM 是一个通用的Java字节码操作和分析框架。 它可以用来修改现有的类或动态地生成类,直接以二进制形式。 ASM提供了一些通用的字节码转换和分析算法,可以从这些算法中构建自定义复杂的转换和代码分析工具。 ASM提供与其他Java字节码框架类似的功能,但主要关注性能。 因为它的设计和实现都尽可能地小和快,所以非常适合在动态系统中使用(当然也可以以静态的方式使用,例如在编译器中)。 特性 ASM 并不是生成和转换已编译Java类的唯一工具,但它是最近和最有效的工具之一。 可以从 http://asm.objectweb.org 下载。其主要优点有: 它有一个简单、设计良好、模块化的API,易于使用。 为最新的 Java 版本提供支持。 它很小,速度很快,而且非常健壮。 其庞大的用户社区可以为新用户提供支持。 它的开放源码许可允许你以任何你想要的方式使用它。 快速入门 jar 引入 < dependency > < groupId > org.ow2.asm </ groupId > < artifactId > asm-all </ artifactId > < version > 5.1 </ version > </ dependency > Hello World HelloWorld.java import org . objectweb . asm .

JDBC连接MySQL/SQL注入

对着背影说爱祢 提交于 2019-12-22 13:02:21
一、JDBC连接MySQL:   1. 添加驱动:mysql-connector-java-5.1.47.jar   2. 创建连接:   (1)加载驱动:Class.forName("com.mysql.jdbc.Driver");     //jdk1.6 以后无需再加载驱动;再引用库 META-INF下会自动加载,但是web项目还是要加载;   (2 )获取连接对象: DriverManager.getConnection(url, user, password);   3. 创建 SQL 语句:   4. 发送 sql 到数据库;   5. 执行 sql 语句;   6. 获取返回的结果:     1)DQL返回查询的结果集;     2)DML返回影响的行数;     3)DDL返回0;   7. 处理结果;   8. 释放资源: Connection.close();Statement.close(); public class Test { public static void main(String[] args) throws Exception { // 1、加载驱动 //把com.mysql.jdbc.Driver这份字节码加载进JVM //当一份字节码被加载到JVMs时,就会执行该字节码中的静态代码块 Class.forName("com.mysql

Java 程序计数器

吃可爱长大的小学妹 提交于 2019-12-22 10:47:34
Java 程序计数器 1. 概述 程序计数器是一块较小的内存空间,它的作用可以看做是 当前线程 所执行的 字节码 的 行号指示器 。 在概念模型中, 字节码解释器 工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要这个计数器来完成 Java 虚拟机的 多线程 是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多喝处理器来说是一个内核)只会执行一条线程中的指令。 因此,为了线程切换后能恢复到正确的执行位置,每个线程都需要有 一个独立的程序计数器 ,各条线程之间的计数器互不影响,独立存储,称这类内存区域为**“线程私有”**的内存。 如果线程现在正在执行的是一个 Java 方法 ,这个计数器记录的是正在执行的虚拟机 字节码指令的地址 如果线程正在执行的是 Native 方法 ,这个计数器值则为 空(Undefined) (Native方法是非Java语言编写,比如c/c++,它们无法在 Java 编译时生成字节码,即JVM 获取不到 native 实现, 只能通过系统指令去调用native方法) 此内存区域是唯一一个在 Java 虚拟机规范中 没有规定任何 OutOfMemoryError 情况的区域 2.特点 占内存很小,唯一不会规定任何 OutOfMemoryError情况

AOP与JAVA动态代理

偶尔善良 提交于 2019-12-22 01:52:09
1、AOP的各种实现 AOP就是面向切面编程,我们可以从以下几个层面来实现AOP 在编译期修改源代码 在运行期字节码加载前修改字节码 在运行期字节码加载后动态创建代理类的字节码 2、AOP各种实现机制的比较 以下是各种实现机制的比较: 类别 机制 原理 优点 缺点 静态AOP 静态织入 在编译期,切面直接以字节码的形式编译到目标字节码文件中 对系统无性能影响 灵活性不够 动态AOP 动态代理 在运行期,目标类加载后,为接口动态生成代理类,将切面织入到代理类中 相对于静态AOP更加灵活 切入的关注点需要实现接口。 对系统有一点性能影响 动态字节码生成 CGLIB 在运行期,目标类加载后,动态构建字节码文件生成目标类的子类,将切面逻辑加入到子类中 没有接口也可以织入 扩展类的实例方法为final时,则无法进行织入 自定义类加载器 在运行期,目标加载前,将切面逻辑加到目标字节码里 可以对绝大部分类进行织入 代码中如果使用了其他类加载器,则这些类将不会被织入 字节码转换 在运行期,所有类加载器加载字节码前进行拦截 可以对所有类进行织入 3、AOP里的公民 Joinpoint:拦截点,如某个业务方法 Pointcut:Joinpoint的表达式,表示拦截哪些方法。一个Pointcut对应多个Joinpoint Advice:要切入的逻辑 Before Advice:在方法前切入 After

7.11.3 Java简介

◇◆丶佛笑我妖孽 提交于 2019-12-21 09:34:20
101Java简介 101Java简介及开发环境搭建 Java简介 编程语言简介 机器语言:纯粹的机器代码 机器语言是有0,1,0,1的二进制代码组成,可以有计算机直接执行。效率最高,但是通用性不强,对于不同的硬件需要不同的程序。说白了,不适合人来编程。 汇编语言:8086汇编、Win32汇编、.NET的汇编 汇编语言:效率稍微低于机器语言,通过简单的助记符来替代繁琐而枯燥的0,1代码。同样的通用性不强,对于不同的硬件需要设计不同语言。学习曲线比较大,需要硬件知识很多。介于其特殊的性质,在某些行业中得到广泛的应用。 高级语言: 高级语言:通过人类可以识别的自然语言(主要是英语)来进行编程,效率再次降低,但是程序编制难度和可读性大幅提高。可移植性好,实用性较好。比较适合大规模开发,是现在大多数人选择的语言。而且Java语言和.NET平台的出现在一定程度上解决了由于平台的不同所导致的移植困难的情况。 Basic、Pascal、Object Pascal、C、C++、Objective-C、Swift、C#、Java、ASP、ASP.NET、Perl、PHP、SQL、FoRTRAN 等等 Visual Basic、Visual Basic.NET、Delphi、Visual C++、C++ Builder、C# Builder、Visual Foxpro 等等 编程语言分类: 编译型

Java初学,基础知识

痴心易碎 提交于 2019-12-21 09:34:01
最近开始学习Java,学习过程中找到的一些资料和笔记,说来惭愧,作为一名程序员,在过去两年时间里,博客园的博客丝毫未见增长,至今始对笔记这些重视起来。 1、JAVA SE 、 JAVA EE 和 JAVA ME 有什么区别? Java 的发展到现在已经不单纯仅仅是一种语言,从更加广泛的范围上来说, Java 代表了一个技术体系。在这个体系中, JAVA SE 、 JAVA EE 、 JAVA ME 则分别代表了不同的方向。 Java SE 全称为: Java Standard Edition ( J2SE 也就是 Java SE )标准版 Java SE 版本为 Java 程序提供了最基本的环境,是 Java 技术的核心和基础。 Java EE 和 Java ME 都建立在 Java SE 的基础之上。 重点学习:集合类、文件操作、 I/O 流、线程、序列化和 GUI 窗体编程等内容 Java EE 全称为: Java Enterprise Edition ( J2EE 也就是 Java EE )企业版 Java EE 是基于服务器分布式企业应用提供开发和运行环境,是目前 Java 应用最广泛的部分。 Java EE 不仅继承了 Java SE 的许多优点,同时还提供了 EJB 、 JSP 、 Servlet 、 XML 的全面支持,降低了企业级开发的复杂度。 重点学习: JSP

JAVA简介——开篇

Deadly 提交于 2019-12-21 09:33:43
一、JAVA的三大体系 JavaSE(J2SE)(Java2 Platform Standard Edition,java平台标准版) JavaEE(J2EE)(Java 2 Platform,Enterprise Edition,java平台企业版) JavaME(J2ME)(Java 2 Platform Micro Edition,java平台微型版) 二、JAVA的特点 Java语言是简单的: Java语言的语法与C语言和C++语言很接近,使得大多数程序员很容易学习和使用。另一方面,Java丢弃了C++中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。特别地,Java语言不使用指针,而是引用。并提供了自动的废料收集,使得程序员不必为内存管理而担忧。 Java语言是面向对象的: Java语言提供类、接口和继承等面向对象的特性,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为implements)。Java语言全面支持动态绑定,而C++语言只对虚函数使用动态绑定。总之,Java语言是一个纯的面向对象程序设计语言。 Java语言是分布式的: Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库

java内存划分

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-21 09:10:13
运行时数据区域 Java虚拟机在执行Java的过程中会把管理的内存划分为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,而有的区域则依赖线程的启动和结束而创建和销毁。 Java虚拟机包括下面几个运行时数据区域: 程序计数器 程序计数器是一块较小的区域,它的作用可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的模型里,字节码指示器就是通过改变程序计数器的值来指定下一条需要执行的指令。分支,循环等基础功能就是依赖程序计数器来完成的。 由于java虚拟机的多线程是通过轮流切换并分配处理器执行时间来完成,一个处理器同一时间只会执行一条线程中的指令。为了线程恢复后能够恢复正确的执行位置,每条线程都需要一个独立的程序计数器,以确保线程之间互不影响。 所以程序计数器是“线程私有”的内存。 如果虚拟机正在执行的是一个Java方法,则计数器指定的是字节码指令对应的地址,如果正在执行的是一个本地方法,则计数器指定问空undefined。 程序计数器区域是Java虚拟机中唯一没有定义OutOfMemory异常的区域。 Java虚拟机栈 和程序计数器一样也是线程私有的,生命周期与线程相同。 虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会创建一个栈帧用于存储局部变量表,操作栈,动态链接,方法出口等信息