JVM规范】的更多相关文章

JVM规范组成: 1. 字节码(ByteCode): 以Class或Interface为基本单位, 具有固定结构. 2. 指令集(InstructionSet): 每个指令用一个字节表示, 最多256条指令, 除却永久留用的指令. 3. 虚拟机(VirtualMachine): 根据字节码, 调用指令集, 管理中间结果.三者之间的关系:…
许多人知道类加载机制.JVM内存模型,但他们可能不知道什么是<Java虚拟机规范>.对于Java开发来说,<Java虚拟机规范>才是最为官方.准确的一个文档,了解这个规范可以让我们更深入地理解JVM.我们平常说的JVM其实更多说的是HotSpot(HotSpot是JVM规范的一种实现),但我们常常将HotSpot与JVM等同起来.正因对于JVM规范认识的不足,所以我专门准备一个系列的文章,带着大家读一读JVM规范. 在接下来的一系列文章中,我将带着大家一个章节一个章节解读<J…
如果你还没下载<Java虚拟机规范>这本书,那么先点击这里下载再一块儿看吧. 前言 Java 虚拟机是一个抽象化的机器,整个规范中提及的 Java 虚拟机都是抽象化的概念,而不是特指 Oracle 或者其他某一间公司的 Java 虚拟机实现. 可以看到JVM其实就是一个虚拟机的机器,与我们的普通PC一样,有内存.有CPU.JVM的内存就是运行时数据区,其CPU就是Java虚拟机指令集. 另外,我们还修正了许多<Java 虚拟机规范(第一版)> 和<Java 语言规范>…
本规范描述的是一种抽象化的虚拟机的行为,而不是任何一种(译者注:包括 Oracle 公司自己的 HotSpot 和 JRockit 虚拟机)被广泛使用的虚拟机实现. 记住:JVM规范是一种高度抽象行为的描述,而不是具体虚拟机的实现. 所有在虚拟机规范之中没有明确描述的实现细节,都不应成为虚拟机设计者发挥创造性的牵绊,设计者可以完全自主决定所有规范中不曾描述的虚拟机内部细节,例如:运行时数据区的内存如何布局.选用哪种垃圾收集的算法.是否要对虚拟机字节码指令进行一些内部优化操作(如使用即时编译器把字…
Oracle 的 JDK 包括两部分内容:一部分是将 Java 源代码编译成 Java 虚拟机的指令集的编译器,另一部分是用于Java 虚拟机的运行时环境. 第一部分应该说的是 Javac 这个前置编译器,用于将Java源代码编译成字节码.第二部分是说 JIT 即时编译器,用于在JVM运行时进行进一步优化,将字节码编译成本地机器码. 即时代码生成器(Just-In-Time/JIT Code Generator)就是一种在 Class 文件中的代码被 Java 虚拟机代码加载后,生成与平台相关的…
这一章节讲的是字节码的整个组成格式,读懂了这一章,就读懂了字节码文件.对于这一章的学习,我更推荐作为工具书去查找.最好是找一个最简单的Hello World例子,一个字节一个字节去分析其含义.在分析过程中,把这个章节当成工具来查询每个字节的含义. 我写了一篇文章来带你一个字节一个字节分析,有兴趣的可以看:JVM系列第5讲:字节码文件结构 Java 虚拟机实现会在文件的链接阶段(§ 5.4)对 Class 文件进行必要的校验. 看到这里,知道JVM会在文件的链接阶段,做JDK版本的校验. 这个章节…
加载是根据特定名称查找类或接口类型的二进制表示(Binary Representation),并由此二进制表示创建类或接口的过程. 加载,就是指去寻找类或接口的过程. 链接是为了让类或接口可以被 Java 虚拟机执行,而将类或接口并入虚拟机运行时状态的过程. 链接,就是将类或接口与JVM链接起来的过程. 类或接口的初始化是指执行类或接口的初始化方法(§ 2.9) 初始化,就是执行方法的过程. Java 虚拟机为每个类型都维护一个常量池. 这里注意关键词「每个类型」,也就是说整型是一个常量池,字符…
一条 Java 虚拟机指令由一个特定操作的操作码和零至多个操作所使用到的操作数所构成. 虚拟机指令 = 操作码 + 操作数. 其中,操作码值分别为 254(0xfe)和 255(0xff),助记符分别为 impdep1 和 impdep2的两个操作码是作为"后门"和"陷阱"出现,目的是在某些硬件和软件中提供一些与实现相关的功能.第三个操作码值分别为 202(0xca).助记符为 breakpoint 的操作码是用于调试器实现断点功能. 三个保留操作码: 254(0x…
我们花了几天的时间来阅读<Java虚拟机规范>,了解要实现一个虚拟机应该包括什么内容.通过这么一次阅读,我们大致了解了虚拟机规范的内容. 第1章.对Java虚拟机进行了一些简单的介绍. 第2章.介绍了虚拟机的结构,以及一些异常体系以及字节码指令集.可以说是规范的重点内容. 第3章.介绍了编译器是如何将Java源代码编译成JVM所需要的字节码的,如何去阅读这些字节码指令. 第4章.这一章针对字节码文件的格式做了详细的讲解,让我们了解字节码里的每一个字节的作用. 第5章.这一章对JVM是如何启动.…
在并发的世界里,选择合适的状态处理方法将对并发性和正确性起到决定性的影响.这方面可选的方法有:共享可变性.隔离可变性以及完全不可变性. 对于并发问题来说最好的解决方法是从根本上消灭它而不是花很多时间解决它.要做到这一点其实很简单,只要消除可变状态就可以了,即我们要围绕不可变性或至少是隔离可变性来设计应用程序. 下面是两种较新的基于JVM虚拟机开发语言Clojure,Scala,Groovy等的解决方案 1.软件事务内存STM(Software Transaction Memory) STM是针对…
http://files.cnblogs.com/files/dragonsuc/jls8.pdf 或者官网:http://files.cnblogs.com/files/dragonsuc/jls8.pdf http://docs.oracle.com/javase/specs/index.html…
一.Java平台的结构图 二.JVM与JRE.JDK关系? JVM:Java Virtual Machine(Java虚拟机),负责执行符合规范的Class文件 JRE:Java Runtime Environment(java运行环境),包含JVM和类库         JDK:Java  Development Kit(java开发工具包),包含JRE和开发工具包,例如javac.javah 相关文章:http://blog.csdn.net/ljheee/article/details/5…
原文地址:http://blog.csdn.net/dream_broken/article/details/49759043 想了解下某个Java项目的运行时jvm的情况,可以使用一些监控工具,比如jdk的bin下就提供了很多工具. 比如,本地运行一个程序,让它死循环 while(true){ try { Thread.sleep(10*1000); } catch (Exception e) { } } 然后,点击启动jconsole.exe 可以发现,jconsole.exe可以连接本地,…
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 为什么学习Java的内存模式 缓存一致性问题 什么是内存模型 JMM(Java Memory Model)简介 volatitle关键字 原子性 可见性 有序性 指令重排 先行发生——happen-before原则 解释执行和编译执行 其他语言(c和c++)也有内存模型么? 为什么需要关注Java内存模型?   之前有一个我实习的同事(已经工作的)反讽我:学(关注)这个有什么用? 我没有回答,我牢记一句话…
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 堆栈是栈 JVM栈和本地方法栈划分 Java中的堆,栈和c/c++中的堆,栈 数据结构层面的堆,栈 os层面的堆,栈 JVM的堆,栈和os如何对应 为啥方法的调用需要栈 属于月经问题了,正好碰上有人问我这类比较基础的知识,无奈我自觉回答不是有效果,现在深入浅出的总结下: 前一篇文章总结了:JVM 的内存主要分为3个分区 堆区(Heap)-- 只存对象(数组)本身(引用类型的数据),不存基本类型和对象的引用…
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: JVM的历史 JVM的运行流程简介 JVM的组成(基于 Java 7) JVM调优参数:-Xmx和-Xms 逃逸分析(DoEscapeAnalysis )的概念——JVM栈上分配实验 JVM中client模式(-client)和server模式(-server)的区别 查看GC日志的方法 使用idea对JVM进行参数输入 Java栈,Java堆和方法区的交互原理 为了能让递归方法调用的次数更多一些,应该怎…
java类的加载机制 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口. 类加载器并不需要等到某个类被“首次主动使用”时再加载它,JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先…
JVM是按照运行时数据的存储结构来划分内存结构的.JVM在运行Java程序时,将他们划分成不同格式的数据,分别存储在不同的区域,这些数据就是运行时数据.运行时数据区域包括堆,方法区,运行时常量池,程序计数器,虚拟机栈,本地方法栈. Java堆 Java堆是JVM所管理的内存中最大的,是被所有线程共享的一块内存区域,在虚拟机启动时创建,唯一目的就是存放对象实例.所有对象实例及数组都在堆上分配内存 方法区(别名非堆) 用于存放被装载的类型信息.类型的常量池.字段信息.方法信息.类静态变量.Class…
最近看了周志明版本的<深入理解Java虚拟机>第一版和第二版,写的很好,收获很多,此处总结一下.   jvm中内存划分:   如上图,一共分为五块,其中: 线程共享区域为: 1.java堆 2.方法区   线程私有区域为: 3.JVM栈 4.本地方法栈 5.程序计数器   各区域作用: 1.java堆:     java堆是jvm内存管理中最大的一块,线程共享.在jvm启动的时候创建.此区域唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存.但是随着JIT编译器(即时编译器)的发展与…
转自:http://blog.csdn.net/zhoudaxia/article/details/26454421/ 每个Java开发者都知道Java字节码是执行在JRE((Java Runtime Environment Java运行时环境)上的.JRE中最重要的部分是Java虚拟机(JVM),JVM负责分析和执行Java字节码.Java开发人员并不需要去关心JVM是如何运行的.在没有深入理解JVM的情况下,许多开发者已经开发出了非常多的优秀的应用以及Java类库.不过,如果你了解JVM的话…
背景介绍 JVM已经是Java开发的必备技能了,JVM相当于Java的操作系统. JVM,java virtual machine, 即Java虚拟机,是运行java class文件的程序. Java代码经过Java编译器编译,会编译成class文件,一种平台无关的代码格式,class文件按照jvm规范,包括了java代码运行所需的元数据和代码等内容.jvm加载class文件后,就可以执行java代码了. JVM有不同的实现,有我们熟悉的Hotspot虚拟机,JRockit等.在各个操作系统上,…
1.ClassLoader(类加载器) 1.加载:查找并加载类的二进制数据 2.连接 —验证:确保被加载的类的正确性(防止不是通过java命令生成的class文件被加载) —准备:为类的静态变量分配内存,并将其初始化为默认值(如int默认值为0) —解析:把类中的符号引用转换为直接引用 3.初始化:为类的静态变量赋予正确的初始值(即代码中指定的值 例:public static int a = 2) JAVA程序对类的使用方式可以分为两种 —主动使用(六种) —被动使用(除了主动使用的六种方法,…
本文旨在给所有希望了解JVM(Java Virtual Machine)的同学一个概念性的入门,主要介绍了JVM的组成部分以及它们内部工作的机制和原理.当然本文只是一个简单的入门,不会涉及过多繁杂的参数和配置,感兴趣的同学可以做更深入的研究,在研究JVM的过程中会发现,其实JVM本身就是一个计算机体系结构,很多原理和我们平时的硬件.微机原理.操作系统都有十分相似的地方,所以学习JVM本身也是加深自我对计算机结构认识的一个很好的途径. 另外需要注意的是,虽然平时我们用的大多是Sun(现已被Orac…
学习JVM第一个要了解的就是JVM的内存区域. Java虚拟机在运行时会从操作系统内存中划分一部分出来作为JVM内存,而JVM内存又划分为以下几个区域: 大体上可以分为两种: 线程共享数据区 该类型的数据区,多个线程共用一个数据区. 线程私有数据区 该类型的数据区,每个线程都拥有自己独立的数据区. 下面逐一介绍图中的数据区: 程序计数器(Program Counter Register) 程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器. 字节码解释工作就是通过改变…
最近开始了全面的JAVA生态环境学习,因此,JVM的学习是必不可少的一个环节.和.NET的CLR一样,一起的JAVA应用均跑在JVM虚拟机上,不过相对我们只能干看看的CLR,JVM有很大的灵活性,可以通过配置优化JVM的性能,同时针对JVM相关的监控软件也非常丰富.这部分知识有一些晦涩,为了成为一名合格的JAVA程序员,再硬的骨头也要啃下来,由于自身对这部分没有特别多的心得,将借鉴参考资料中标注的文章进行学习. 首先通过数据类型来引入一个高级语言的核心概念,堆和栈.JAVA的基本类型包括:byt…
译者语 为加深对JVM的了解和日后查阅时更方便,于是对原文进行翻译.内容是建立在我对JVM的认识的基础上翻译的,加上本人的英语水平有限,若有纰漏请大家指正,谢谢. 原文地址:http://blog.jamesdbloom.com/JVMInternals.html 一.前言 本文将介绍JVM内部架构.下图展示符合Java7规范的JVM内部主要组件. 下面我们将上述组件分为线程相关和线程独立两种类型来介绍. 二.目录 Thread Per Thread program Counter (PC) S…
Java虚拟机JVM学习02 类的加载概述 类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构. 加载.class文件的方式: 1.从本地系统中直接加载 2.通过网络下载.class文件 3.从zip,jar等归档文件中加载.class文件 4.从专有数据库中提取.class文件 5.将Java源文件动态编译为.class文件 类的加载的最终产品是位于堆区中…
类的加载: 指的是将class文件的二进制数据读入到运行时数据区(JVM在内存中划分的) 中,并在方法区内创建一个class对象. 类加载器: 负责加载编译后的class文件(字节码文件)到JVM(Java虚拟机)当中. 而类加载器主要分为以下几种: 1.Bootstrap class loader (引导类加载器) 负责加载Java核心类库.在jre\lib目录下,包括rt.jar(Java基础类库),这些 都是Java的核心类库.而且这个加载器是由C语言编写的,所以在Java程序中是获取 不…
先发个链接到两位大牛的主页 http://rednaxelafx.iteye.com/               http://icyfenix.iteye.com/ 目录 1)概述 2)编译 3)Class文件结构 4)通过ClassLoader加载Class 5)类执行机制 6)运行时数据区 7)垃圾回收相关 8)多线程 9)故障检测工具及命令 10)其他 1) 概述 1.1) 引用一张官网的图阐明JDK.JRE.JVM.JIT的关系(如下图所示),我们可以看见JDK>JRE>JVM&g…