字节码

【JAVA 虚拟机的内存模型】

寵の児 提交于 2019-12-10 07:45:45
1.这个话题其实被很多人写过了,但是也会被很多人继续写下去,我就是其中一个。 2.JVM的内存划分其实并不是一样的,因为每个虚拟机,每个版本都会有一定的改动。本文讨论的是HotSpot虚拟机的内存模型(JAVA虚拟机的一个版本)。 以上就是JVM的内存结构。 一个一个来说。 首先提两个概念:线程私有和线程共享。这个指的是在多线程的环境下,如果一个线程的某些资源只能是自己访问,其他线程不可访问,那么就是线程私有,相反,如果所有线程共享某份资源就是线程共享。 (1)程序计数器,(Program Counter Register)。这个在机组里面其实有很到位的解释,当然了这里其实和机组里面的是差不多的。因为JVM主要是解释字节码的,所以这个计数器的作用就是标识当前线程解释到了哪一行字节码,通过改变这个计数器的值来让程序不断地执行。这块内存肯定是线程私有的,因为每个线程解释到的位置是不尽相同的,所以这个具有线程的特殊性,必须线程私有。 (2)JAVA虚拟机栈(JAVA Virtual Machine Stacks)。虚拟机栈其实是描述JAVA方法执行的内存模型,这个很好理解,比如当前线程里面有很多函数执行,那么这些函数需要压栈,出栈等。这些操作都是在这个虚拟机栈里完成的。这个也是线程私有的。 (3)本地方法栈。(Native Method Stack)。这个其实是为了本地方法而设置的栈

java字节码指令集

匆匆过客 提交于 2019-12-10 04:13:30
字节码指令集   Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的操作码(Opcode)以及跟随其后的零至多个代表此操作所需参数的操作数(Operands)所构成。   对于大部分为与数据类型相关的字节码指令,他们的操作码助记符中都有特殊的字符来表明专门为哪种数据类型服务:i代表对int类型的数据操作,l代表long,s代表short,b代表byte,c代表char,f代表float,d代表double,a代表reference。   加载和存储指令: 将一个局部变量加载到操作栈的指令包括有: iload、iload_<n>、lload、lload_<n>、fload、fload_<n>、dload、dload_<n>、aload、aload_<n> 将一个数值从操作数栈存储到局部变量表的指令包括有: istore、istore_<n>、lstore、lstore_<n>、fstore、fstore_<n>、dstore、dstore_<n>、astore、astore_<n> 将一个常量加载到操作数栈的指令包括有: bipush、sipush、ldc、ldc_w、ldc2_w、aconst_null、iconst_m1、iconst_<i>、lconst_<l>、fconst_<f>、dconst_<d> 扩充局部变量表的访问索引的指令: wide   运算指令:

Java基础知识——JVM基础

非 Y 不嫁゛ 提交于 2019-12-10 01:31:09
JVM基础 jvm:运行在操作系统上的假想的计算机 1:Java文件的编译和解释 2:Java线程 3:JVM组成 4:GC回收算法 5:Java引用 6:GC垃圾收集器 7:Java IO/NIO 8:类加载 执行过程 Java源文件——编译器javac——class文件(字节码文件,二进制文件) 字节码文件——解释器(jvm)java——机器码文件 每一台平台解释器不同,但是虚拟机相同,跨平台的原因。 一个程序对应一个虚拟机,多个程序对应多个虚拟机, 虚拟机之间数据不共享 什么是平台:操作系统及其硬件环境。跨平台即代码的运行不依赖于操作系统及其硬件环境。 c语言不是跨平台的,因为不同操作系统下的编译器编译代码得到不同文件,不能在其他操作系统上运行。即由Windows编译器得到的exe文件不能在Linux上运行 Java跨平台:因为编译后都得到class文件,可以在不同的操作系统上的解释器上执行。 并且注意: 不同的系统下有不同的JVM,所以JVM不是跨平台 JAVA依赖于JVM,JVM给JAVA提供了运行环境,所以JAVA是跨平台的。 程序执行的方式: 第一是编译执行:C它把源程序由特定平台的编译器一次性编译为平台相关的机器码,优点是执行速度快,缺点是无法跨平台; 第二是解释执行,如HTML,JavaScript,它使用特定的解释器,把代码一行行解释为机器码,类似于同声翻译

ByteCode Instrumentation

独自空忆成欢 提交于 2019-12-09 23:46:32
Bytecode Instrumentation 定义 我们首先来看看,什么叫“Instrumentation”?Instrumentation这个词有很多意思,在维基百科中,它是这样解释的: Instrumentation is the use of measuring instruments to monitor and control a process. It is the art and science of measurement and control of process variables within a production, laboratory, or manufacturing area. 似乎中文中没有一个合适的词来描述,意思就是“使用计量器具去监控和控制一个流程”就可以被叫做“Instrumentation”。比如下面这个很 直观的器具就被用来做Instrumentation了。 什么是ByteCode Instrumentation 这是我在 网上 [2] ( 大专栏 ByteCode Instrumentation noreferrer">http://www.ibm.com/developerworks/cn/java/j-rtm2/index.html)看到的一个定义,里面对“bytecode instrumentation”的翻译就是

【原创】基于注解运行时动态ORM映射

喜夏-厌秋 提交于 2019-12-09 20:08:20
由于当前项目采用了分表策略,故一个实体会对应多个相同结构的表。只是映射的表名不一样而已~项目又使用憨包儿呢特(Hibernate),让我采用原生SQL总感觉不是那么爽,咋办呢?!第一念头就是如果能够动态映射就好啦,也就是现在想查table1只需将实体对应的 table映射为table1即可。咋个实现动态映射呢?!也就是需要动态改变类的注解。又咋个能够动态改变类的注解呢?!本质上修改字节码,重新加载类即可,也就是所谓的字节码增强功能~ 看都看不懂字节码咋个修改呢?!还是需要站在巨人的肩上才行。ASM以及JDK自带的字节码增强都不用,马上想到CGlib,javassist。。。还是痛苦的折腾了良久,为了大家不走我的弯路~ 直接上代码先~ 动态映射代码如下: 1: public class ClassPoolUtils { 2: 3: 4: /** 5: * 动态ORM映射 6: * 7: * @param entityClassName 待映射的实体全限定类名 8: * @param tableName 待映射的表名 9: * @return 映射后的类对象 10: */ 11: public static Class<?> tableMapping(String entityClassName, String tableName){ 12: Class<?> c = null ;

浏览器的细说

自作多情 提交于 2019-12-09 19:48:18
一:对浏览器的内核了解: 浏览器内核由两个部分组成: 渲染引擎 和 JS引擎 渲染引擎 :负责取得网页的内容(html,xml和图像等),整理讯息(例如假如css),以及计算网页的显示方式,然后输出到显示器或打印机。浏览器的内核的不同对于网页的语法解释会有不同,所以渲染的效果也不同。所有网页浏览器、电子邮件客户端以及它需要编辑、显示网络内容的应用程序都需要内核。 JS引擎 :解析和执行JavaScript来实现网页的动态效果。 二.常见的浏览器内核有哪些? IE浏览器内核:Trident内核,也被称为IE内核 Chrome浏览器内核:Chromium内核 → Webkit内核 → Blink内核 Firefox浏览器内核:Gecko内核,也被称Firefox内核 Safari浏览器内核:Webkit内核 Opera浏览器内核:最初是自主研发的Presto内核,后跟随谷歌,从Webkit到Blink内核 360浏览器、猎豹浏览器内核:IE+Chrome双内核 搜狗、遨游、QQ浏览器内核:Trident(兼容模式)+ Webkit(高速模式) 百度浏览器、世界之窗内核:IE内核 三.JS引擎的组成有: 编译器 :将源代码编译成抽象语法树,在某些引擎中还包含将抽象语法树转换成字节码。 解释器 :在某些引擎中,解释器主要是接收字节码,解释执行这个字节码,同时也依赖垃圾回收机制等 JIT

类加载的处理

空扰寡人 提交于 2019-12-09 15:44:16
java的类加载处理的原则是 用的时候再加载 如果在main方法的启动的时候 有import或者 在后续的延伸的类中 有用到这个类 就会把这个类加载进去 具体可以通过参数 -XX:+TraceClassLoading 进行查看。 我们有如下类 a.A.java b.B.java 我们在B.java 里面写一个main方法 不引入A.java的时候 在控制台是不会打印加载A的信息的 这个时候 方法区是不存在A的信息的。 这里可以spring的处理就方便了 事实上 我们写的代码 和spring框架的代码 是不存在关联的(也不准确 应该说成是两个层好一点)spring框架在启动的时候 是不会去调用的我们的代码的 因为不存在import 而且这个框架本身也不知道不我们写的业务逻辑代码 是无感的。 这个时候那一堆注解就派上用场了,事实上spring不会去通过类加载器去加载我们的代码到jvm中,他会通过类加载器去获取我们的代码的文件目录 然后挨个扫描编译后的class文件(这里 在idea里面和打成jar后类加载器 有所不同 因为文件的组织方式变了)通过注解信息生成一系列的bean信息 这个bean会记录这个类里面所有标识的注解 包括一些需要默认指定的。然后根据注解信息使用代理工具(目前应该是cglib) 进行包装 我们的@requestContoller 以及aop transaction

java特性

北慕城南 提交于 2019-12-09 14:42:40
主要特性 1. 简单高级语言 Java语言的语法与C语言和C++语言很接近,使得大多数程序员很容易学习和使用。另一方面,Java丢弃了C++中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。特别地,Java语言不使用指针,而是引用。并提供了自动的废料收集,使得程序员不必为内存管理而担忧。 2.java是面向对象编程的 Java语言提供类、接口和继承等面向对象的特性,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为implements)。Java语言全面支持动态绑定,而C++语言只对虚函数使用动态绑定。总之,Java语言是一个纯的面向对象程序设计语言。 3.java语言是分布式的 Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。 4.java语言是健壮的 Java的强类型机制、异常处理、垃圾的自动收集等是Java程序健壮性的重要保证。对指针的丢弃是Java的明智选择。Java的安全检查机制使得Java更具健壮性。 5.java 语言是安全的

Python学习笔记之二——Python的运行机制,一般人肯定不会

泄露秘密 提交于 2019-12-09 14:02:22
前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。 作者:XX Python解释器简介   解释器是一种让其他程序运行起来的程序,它是代码与机器的计算机硬件之间的软件逻辑层,Python解释器就是能够让Python程序在机器上执行的一套程序。 当我们执行写好的Python代码时,Python解释器会执行两个步骤 把原始代码编译成字节码   编译后的字节码是特定于Python的一种表现形式,它不是二进制的机器码,需要进一步编译才能被机器执行,这也是Python代码无法运行的像C/C++ 一样快的原因。如果Python进程在机器上拥有写入权限,那么它将把程序的字节码保存为一个以.pyc 为扩展名的文件,如果Python无法在机器上写入字节码,那么字节码将会在内存中生成并在程序结束时自动丢弃。在构建程序的时候最好给Python赋上在计算机上写的权限,这样只要源代码没有改变,生成的.pyc文件可以重复利用,提高执行效率。 把编译好的字节码转发到Python虚拟机(PVM)中进行执行 ,另外如果你在python学习过程中。不懂的问题,可以去去小编的Python交流.裙 :一久武其而而流一思(数字的谐音)转换下可以找到了,里面有最新Python教程项目,多跟里面大佬交流。进步会更快!   PVM是 Python

java forEach实现原理

偶尔善良 提交于 2019-12-09 05:00:56
java.util.List实现了java.lang.Iterable接口. jdk api文档中是这样描述Iterable接口的:实现这个接口允许对象成为 "foreach" 语句的目标。不过咋一看Iterable接口并没啥特别之处,只是定义了一个迭代器而已。 [java] view plain copy public interface Iterable<T> { /** * Returns an iterator over a set of elements of type T. * * @return an Iterator. */ Iterator<T> iterator(); } 究竟是如何实现foreach的呢,想想可能是编译器做了优化,就看了下最终编译成的字节码 [java] view plain copy public class Iterable_eros { List<String> strings; public void display(){ for (String s : strings){ System.out.println(s); } } } 相应的字节码为 [java] view plain copy public void display (){ line0 : aload_0 getfield java.util.List my.lang