字节码

今天是JVM的生日,来了解下JVM的发展历史吧

血红的双手。 提交于 2019-12-05 19:43:43
1991年4月,由James Gosling主导的团队创造了Oak语言,java的前身,1995年5月23号,Oak语言更名Java,并且提出那句注明的:”write Once,Run Anywhere”的口号.1996年1月23日,JDK1.0发布. 当时正好赶上浏览器快速崛起,发展的浪潮,大家发现java一处编译到处使用的特性和浏览器很契合,同一个页面不可能每一个操作系统我都写一遍.用现在的话说java正好站在这个风口上.导致它飞速发展才有了今天的江湖地位. 一、JVM简介 JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。 Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后

IDEA 查看字节码

给你一囗甜甜゛ 提交于 2019-12-05 17:23:32
参考:https://www.jianshu.com/p/18953ec8c0b7 打开工具栏 输入参数: 参数: $JDKPath$\bin\javap.exe -c $FileClass$ $OutputPath$ 来源: https://www.cnblogs.com/baizhuang/p/11936604.html

小白理解安卓虚拟机以及华为的'诺亚方舟'

佐手、 提交于 2019-12-05 17:20:40
虚拟机,提到虚拟机,大家可能第一反应就是java中好像有虚拟机这个玩意。但是安卓中的虚拟机是什么呢?是和java一样的吗?那么我们先来了解一下java中的JVM! JVM,搞java的肯定对它了解不少。JVM本质上就是一个软件,是计算机硬件的一层软件抽象,在这之上才干够运行Java程序,JAVA在编译后会生成相似于汇编语言的JVM字节码,与C语言编译后产生的汇编语言不同的是,C编译成的汇编语言会直接在硬件上跑。但JAVA编译后生成的字节码是在JVM上跑,须要由JVM把字节码翻译成机器指令。才干使JAVA程序跑起来。JVM运行在操作系统上,屏蔽了底层实现的差异。从而有了JAVA吹嘘的平台独立性和Write Once Run Anywhere。依据JVM规范实现的详细虚拟机有几十种,主流的JVM包括Hotspot、Jikes RVM等。都是用C/C++和汇编编写的,每一个JRE编译的时候针对每一个平台编译。因此下载JRE(JVM、Java核心类库和支持文件)的时候是分平台的,JVM的作用是把平台无关的.class里面的字节码翻译成平台相关的机器码,来实现跨平台。 说白了,简单点,就是: Java .java文件 -> .class文件 -> .jar文件 最后执行是class文件,有的会被再次打包成jar文件。 了解了这些之后,我们再去了解Android 中的虚拟机。 一

Java学习笔记1-JVM原理

£可爱£侵袭症+ 提交于 2019-12-05 16:54:51
Java学习笔记1-JVM原理 class字节码开头0xcafebabe特殊标志 源代码.java 编译 -> 字节码.class -> JVM运行时数据区 线程共享部分 线程独占部分 方法区 虚拟机栈 | 本地方法栈 堆内存 程序计数器 线程独占 :每个线程都会有它独立的空间,随线程生命周期而创建和销毁 线程共享 :所有线程能访问这块内存数据,随虚拟机或者GC而创建和销毁 方法区 :JVM用来存储加载的类信息、常量、静态变量、编译后的代码等数据。虚拟机规范中这是一个逻辑区划。具体实现根据不同虚拟机来实现。如:Oracle(Sun)的HotSpot在java7中方法区放在永久代,java8放在元数据空间,并且通过GC机制对这个区域进行管理 堆内存 :还可以细分为:老年代、新生代(Eden、From Survivor、To Survivor),JVM启动时创建,存放对象的实例,所有实例字段、静态字段和数组元素都存储在堆内存中。垃圾回收器主要就是管理堆内存。如果满了,就会出现OutOfMemroyError 虚拟机栈 :每个线程都在这个空间有一个私有空间。线程栈由多个栈帧(Stack Frame)组成。一个线程会执行一个或多个方法,一个方法对应一个栈帧。栈帧内容包含:局部变量表、操作数栈、动态链接、方法返回地址、附加信息等。栈内存默认最大是1M

JAVA反射机制

本秂侑毒 提交于 2019-12-05 15:32:01
普通的java对象是通 过new关键 字把对应类的字节码文件加载到内存,然后创建该对象的。 反射是通过一个名为 Class的特殊类 ,用Class.forName("className");得到类的字节码对象,然后用newInstance()方法在虚拟机内部构造这个对象(针对无参构造函数)。 也就是说反射机制让我们可以先拿到java类对应的字节码对象,然后动态的进行任何可能的操作, 包括 在运行时判断任意一个对象所属的类 在运行时构造任意一个类的对象 在运行时判断任意一个类所具有的成员变量和方法 在运行时调用任意一个对象的方法 这些都是反射的功能。使用反射的主要作用是方便程序的扩展。 来源: https://www.cnblogs.com/yz123/p/11931339.html

第一章引论

有些话、适合烂在心里 提交于 2019-12-05 12:49:02
文章目录 完成这项翻译工作的软件系统称为编译器( compiler) 本书介绍的是设计和实现编译器的方法。 在本章中,我们将介绍语言翻译器的不同形式,在高层次上概述一个典型编译器的结构,并讨论了程序设计语言和硬件体系结构的发展趋势。 1.1语言处理器 如果目标程序是一个可执行的机器语言程序,那么它就可以被用户调用,处理输入并产生输出。参见图1-2。 解释器( Interpreter)是另一种常见的语言处理器。 在把用户输入映射成为输出的过程中,由一个编译器产生的机器语言目标程序通常比一个解释器快很多。 例1.1 为了更快地完成输人到输出的处理,有些被称为即时(jutIn time)编译器的Jawa编译器在运行中间程序处理输入的前一刻首先把字节码翻译成为机器语言,然后再执行程序。 如图1-5所示,除了编译器之外,创建一个可执行的目标程序还需要一些其他程序。 程序设计语言是向人以及计算机描述计算过程的记号。 如我们所知,这个世界依赖于程序设计语言,因为在所有计算机上运行的所有软件都是用某种程序设计语言编写的。 但是,在一个程序可以运行之前,它首先需要被翻译成一种能够被计算机执行的形式。 完成这项翻译工作的软件系统称为编译器( compiler) 本书介绍的是设计和实现编译器的方法。 我们将介绍用于构建面向多种语言和机器的翻译器的一些基本思想。

Java基础知识

走远了吗. 提交于 2019-12-05 11:21:29
1. 面向对象和面向过程的区别 面向过程 优点: 性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。 缺点: 没有面向对象易维护、易复用、易扩展 面向对象 优点: 易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护 缺点: 性能比面向过程低 2. Java 语言有哪些特点 简单易学; 面向对象(封装,继承,多态); 平台无关性( Java 虚拟机实现平台无关性); 可靠性; 安全性; 支持多线程( C++ 语言没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程程序设计,而 Java 语言却提供了多线程支持); 支持网络编程并且很方便( Java 语言诞生本身就是为简化网络编程设计的,因此 Java 语言不仅支持网络编程而且很方便); 编译与解释并存; 3. 什么是 JDK 什么是 JRE 什么是 JVM 三者之间的联系与区别 这几个是Java中很基本很基本的东西,但是我相信一定还有很多人搞不清楚!为什么呢?因为我们大多数时候在使用现成的编译工具以及环境的时候,并没有去考虑这些东西。 JDK: 顾名思义它是给开发者提供的开发工具箱,是给程序开发者用的。它除了包括完整的JRE(Java Runtime

JVM-2-JVM结构

孤者浪人 提交于 2019-12-05 10:03:56
什么是JVM JVM是可运行Java代码的假想计算机 (或者理解为一种规范),包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收,堆 和 一个存储方法域。JVM是运行在操作系统之上的,它与硬件没有直接的交互。 三种JVM产品 Oracle (Sun) HotSpot Oracle (BEA) JRockit IBM J9 为什么用JVM ---------------JVM和操作系统交互 实现java语言跨平台的特性。 我们都知道Java源文件,通过编译器,能够生产相应的.Class文件,也就是字节码文件,而字节码文件又通过Java虚拟机中的解释器,编译成特定机器上的机器码 。 • Java源文件—->编译器—->字节码文件 • 字节码文件—->JVM—->机器码 什么是JVM体系结构 什么是JVM运行时数据区 来源: https://www.cnblogs.com/wf-zhang/p/11920779.html

JVM运行时数据区域

狂风中的少年 提交于 2019-12-05 09:27:47
参考自《深入理解JAVA虚拟机》第二版 第2章 Java内存区域与内存溢出异常 2.1 概述 对于Java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要为每一个new操作去写配对的delete/free代码,由虚拟机管理内存这 一切看起来都很美好 ,一旦出现 内存泄漏和溢出方面 的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将会成为一项异常艰难的工作。 2.2 运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途。 2.2.1 程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的 行号指示器 。 在虚拟机的概念模型里,字节码解释器工作时就是通过 改变这个计数器的值来选取下一条 需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。 由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻, 一个处理器都只会执行一条线程 中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,我们称这类内存区域为 线程私有 的内存。 2.2.2 Java虚拟机栈 Java虚拟机栈(Java Virtual

Java中Class类对象详解

心不动则不痛 提交于 2019-12-05 09:24:05
Class类简介:   在java世界里,一切皆对象。从某种意义上来说,java有两种对象:实例对象和Class对象。   每个类的运行时的类型信息就是用Class对象表示的。它包含了与类有关的信息。其实我们的实例对象就通过Class对象来创建的。   Java使用Class对象执行其RTTI(运行时类型识别,Run-Time Type Identification),多态是基于RTTI实现的。   每一个类都有一个Class对象,每当编译一个新类就产生一个Class对象,基本类型 (boolean, byte, char, short, int, long, float, and double)有Class对象,数组有Class对象,就连关键字void也有Class对象(void.class)。Class对象对应着java.lang.Class类,如果说类是 对象 抽象和集合的话,那么Class类就是对 类 的抽象和集合。   Class类没有公共的构造方法, Class对象是在类加载的时候由Java虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的 ,因此不能显式地声明一个Class对象。一个类被加载到内存并供我们使用需要经历如下三个阶段:   1. 加载,这是由类加载器(ClassLoader)执行的。通过一个类的全限定名来获取其定义的二进制字节流