java虚拟机原理(深入理解jvm原理之逃逸分析)

本文目录
- 深入理解jvm原理之逃逸分析
- JAVA反射机制原理
- java工作原理
- java虚拟机工作原理
- 虚拟机是怎样运行的,原理是什么
- 深入探索Java工作原理:JVM,内存回收及其他
- 揭秘Java虚拟机:JVM设计原理与实现详细资料大全
- 在安装虚拟机的时候,那个kdump是个什么东西
深入理解jvm原理之逃逸分析
最近一直在学习Java虚拟机原理,觉得有意思的地方就写个文章记录下来。优胜劣汰是自然界的发展,适用到Java虚拟机也不为过,jvm过了生存下去,一直在自我进化,Java虚拟机也在不停的进化和优化,有的是基于执行代码的优化,例如指令重排序等等;有的是基于分析技术,例如关系分析或者逃逸分析等等,今天就重点介绍一下jvm中的分析技术优化---逃逸分析;内容大部分源自于《深入理解Java虚拟机》;
逃逸分析一般分为两种:一种基本行为就是分析对象的动态作用域,当一个对象在方法中定义后,它可能被外部的方法所引用,例如作为调用参数传入了其他对象中,称为方法逃逸;甚至被外部线程所引用,例如赋值给变量或可以在其他线程中访问的变量,这种优化行为称为线程逃逸;
概念归概念,最终效果怎么样,肯定还需要是骡子是马拉出来遛遛,总牛的理论需要落地检验,说程序员的话,也就是一个对象不会逃逸到方法或者线程之外后,这个变量会进行一些高效的优化;实现方式一般有下面几种;
栈上分配:无论是C#还是Java的程序员,大家都知道,对象会创建在Java堆上,而Java堆中的对象对线程(Java线程)是共享和可见的,而虚拟机的垃圾回收就是回收对象不再适用的对象,无论哪种垃圾回收器,都需要需要筛选和整理可回收的对象,回收和整理要耗费很长时间,如果确定一个方法不会逃逸出方法之外,那就让这个对象直接分配在栈上,而对象所占用的空间也会随着帧栈的出栈而销毁,垃圾回收系统的压力会就变的小了;
消除同步:线程同步本身就是一个相对耗时的过程(至于为什么耗时,可以查询用户线程和内核线程相关知识),如果确认一个对象不会被其他线程访问;那么变量的读写就不会和其他线程竞争,对于这种变量实施的同步可以消除;
标量替换:标量又称scalar是指一个数据已经无法再分解成更小的数据来表示了,Java虚拟机中的原始数据例如int,long,等值类型以及reference类型,都不能再进一步分解,他们就可以称为标量,相对的,它们如果可以继续分解,那就是称为聚合量又称Aggregate,Java对象就是典型的聚合量,如果把一个对象拆散,根据程序访问情况,将其使用到的成员变量类型变成基本类型代替,如果jvm逃逸分析中发现这个对象不会外部对象使用,那程序执行的就不会创建该对象,为改为创建它的若干个被这个方法使用的成员变量来代替(栈上创建的数据,又很大的概率会被jvm分配至物理机的高速寄存器中存储),这个也为后续进一步的优化创造了条件;
逃逸分析很多优势还在陆陆续续发现,Java8已经默认开启了逃逸分析, -XX:+DoEscapeAnalysis 开启或者关闭这个选项;都是干活,后续上带么和截图来验证一下;
JAVA反射机制原理
运行时类型识别(Run-timeTypeIdentification,RTTI)主要有两种方式,一种是我们在编译时和运行时已经知道了所有的类型,另外一种是功能强大的“反射”机制。
要理解RTTI在Java中的工作原理,首先必须知道类型信息在运行时是如何表示的,这项工作是由“Class对象”完成的,它包含了与类有关的信息。类是程序的重要组成部分,每个类都有一个Class对象,每当编写并编译了一个新类就会产生一个Class对象,它被保存在一个同名的.class文件中。在运行时,当我们想生成这个类的对象时,运行这个程序的Java虚拟机(JVM)会确认这个类的Class对象是否已经加载,如果尚未加载,JVM就会根据类名查找.class文件,并将其载入,一旦这个类的Class对象被载入内存,它就被用来创建这个类的所有对象。一般的RTTI形式包括三种:
1.传统的类型转换。如“(Apple)Fruit”,由RTTI确保类型转换的正确性,如果执行了一个错误的类型转换,就会抛出一个ClassCastException异常。
2.通过Class对象来获取对象的类型。如
Classc=Class.forName(“Apple”);
Objecto=c.newInstance();
3.通过关键字instanceof或Class.isInstance()方法来确定对象是否属于某个特定类型的实例,准确的说,应该是instanceof/Class.isInstance()可以用来确定对象是否属于某个特定类及其所有基类的实例,这和equals()/==不一样,它们用来比较两个对象是否属于同一个类的实例,没有考虑继承关系。
反射
如果不知道某个对象的类型,可以通过RTTI来获取,但前提是这个类型在编译时必须已知,这样才能使用RTTI来识别。即在编译时,编译器必须知道所有通过RTTI来处理的类。
使用反射机制可以不受这个限制,它主要应用于两种情况,第一个是“基于构件的编程”,在这种编程方式中,将使用某种基于快速应用开发(RAD)的应用构建工具来构建项目。这是现在最常见的可视化编程方法,通过代表不同组件的图标拖动到图板上来创建程序,然后设置构件的属性值来配置它们。这种配置要求构件都是可实例化的,并且要暴露其部分信息,使得程序员可以读取和设置构件的值。当处理GUI时间的构件时还必须暴露相关方法的细细,以便RAD环境帮助程序员覆盖这些处理事件的方法。在这里,就要用到反射的机制来检查可用的方法并返回方法名。Java通过JavaBeans提供了基于构件的编程架构。
第二种情况,在运行时获取类的信息的另外一个动机,就是希望能够提供在跨网络的远程平台上创建和运行对象的能力。这被成为远程调用(RMI),它允许一个Java程序将对象分步在多台机器上,昌平镇java培训认为这种分步能力将帮助开发人员执行一些需要进行大量计算的任务,充分利用计算机资源,提高运行速度。
java工作原理
Java工作原理
由四方面组成:
(1)Java编程语言
(2)Java类文件格式
(3)Java虚拟机
(4)Java应用程序接口
当并运行一个Java程序时,需要同时涉及到这四种方面。使用文字软件(例如记事本、写字板、UltraEdit等)或集成开发环境(Eclipse、MyEclipse等)在Java源文件中定义不同的类 ,通过调用类(这些类实现了Java API)中的方法来访问资源系统,把源文件编译生成一种二进制中间码,存储在class文件中,然后再通过运行与操作系统平台环境相对应的Java虚拟机来运行class文件,执行编译产生的字节码,调用class文件中实现的方法来满足程序的Java API调用 。
java虚拟机工作原理
从宏观上介绍一下Java虚拟机的工作原理。从最初编写的Java源文件(.java文件)是如何一步步执行的,如下图所示,首先Java源文件经过前端编译器(javac或ECJ)将.java文件编译为Java字节码文件,然后JRE加载Java字节码文件,载入系统分配给JVM的内存区,然后执行引擎解释或编译类文件,再由即时编译器将字节码转化为机器码。主要介绍下图中的类加载器和运行时数据区两个部分。
(1)类加载指将类的字节码文件(.class)中的二进制数据读入内存,将其放在运行时数据区的方法区内,然后在堆上创建java.lang.Class对象,封装类在方法区内的数据结构。类加载的最终产品是位于堆中的类对象,类对象封装了类在方法区内的数据结构,并且向JAVA程序提供了访问方法区内数据结构的接口。如下是类加载器的层次关系图。
启动类加载器(BootstrapClassLoader):在JVM运行时被创建,负责加载存放在JDK安装目录下的jre\lib的类文件,或者被-Xbootclasspath参数指定的路径中,并且能被虚拟机识别的类库(如rt.jar,所有的java.*开头的类均被Bootstrap ClassLoader加载)。启动类无法被JAVA程序直接引用。
扩展类加载器(Extension ClassLoader):该类加载器负责加载JDK安装目录下的\jre\lib\ext的类,或者由java.ext.dirs系统变量指定路径中的所有类库,开发者也可以直接使用扩展类加载器。
应用程序类加载器(AppClassLoader):负责加载用户类路径(Classpath)所指定的类,开发者可以直接使用该类加载器,如果应用程序中没有定义过自己的类加载器,该类加载器为默认的类加载器。
用户自定义类加载器(User ClassLoader):JVM自带的类加载器是从本地文件系统加载标准的java class文件,而自定义的类加载器可以做到在执行非置信代码之前,自动验证数字签名,动态地创建符合用户特定需要的定制化构建类,从特定的场所(数据库、网络中)取得java class。
注意如上的类加载器并不是通过继承的方式实现的,而是通过组合的方式实现的。而JAVA虚拟机的加载模式是一种委派模式,如上图中的1-7步所示。下层的加载器能够看到上层加载器中的类,反之则不行。类加载器可以加载类但是不能卸载类。说了一大堆,还是感觉需要拿点代码说事。
首先先定义自己的类加载器MyClassLoader,继承自ClassLoader,并覆盖了父类的findClass(String name)方法,如下:
利用定义的类加载器加载指定的字节码文件,如通过MyClassLoader加载C:\\Users\\Administrator\\下的Test.class字节码文件,代码如下所示:
(2)运行时数据区
字节码的加载第一步,其后分别是认证、准备、解析、初始化,那么这些步骤又具体做了哪些工作,如下图所示:
(3)如下将介绍运行时数据区,主要分为方法区、Java堆、虚拟机栈、本地方法栈、程序计数器。其中方法区和Java堆一样,是各个线程共享的内存区域,而虚拟机栈、本地方法栈、程序计数器是线程私有的内存区。
Java堆:Java堆是Java虚拟机所管理的内存中最大的一块,被进程的所有线程共享,在虚拟机启动时被创建。该区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存,随着JIT编译器的发展与逃逸分支技术逐渐成熟,栈上分配、标量替换等优化技术使得对象在堆上的分配内存变得不是那么“绝对”。Java堆是垃圾收集器管理的主要区域。由于现在的收集器基本都采用分代收集算法,所以Java堆中还可以分为老年代和新生代(Eden、From Survivor、To Survivor)。根据Java虚拟机规范,Java堆可以处于物理上不连续的内存空间,只要逻辑上连续即可。该区域的大小可以通过-Xmx和-Xms参数来扩展,如果堆中没有内存完成实例分配,并且堆也无法扩展,将会抛出OutOfMemoryError异常。
方法区:用于存储被Java虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。不同于Java堆的是,Java虚拟机规范对方法区的限制非常宽松,可以选择不实现垃圾收集。但并非数据进入了方法区就“永久”存在了,这区域内存回收目标主要是针对常量池的回收和对类型的卸载。如果该区域内存不足也会抛出OutOfMemoryError异常。
常量池:这个名词可能大家也经常见,是方法区的一部分。Class文件除了有类的版本、字段、方法、接口等描述信息外,还有一项信息就是常量池,用于存放编译期生成的各种字面量和符号引用。Java虚拟机运行期间,也可能将新的常量放入常量池(如String类的intern()方法)。
虚拟机栈:线程私有,生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。如果请求的站深度大于虚拟机所允许的深度,将抛出StackOverflowError异常,虚拟机栈在动态扩展时如果无法申请到足够的内存,就会抛出OutOfMemoryError异常。
过最简单的一段代码解释一下,程序在运行时数据区个部分的变化情况。
(4)通过编译器将Test.java文件编译为Test.class,利用javap -verbose Test.class对编译后的字节码进行分析,如下图所示:
(5)看看运行时数据区的变化:
虚拟机是怎样运行的,原理是什么
虚拟机的运行:
指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。
原理:
从最初编写的Java源文件(.java文件)是如何一步步执行的,如下图所示,首先Java源文件经过前端编译器(javac或ECJ)将.java文件编译为Java字节码文件。
然后JRE加载Java字节码文件,载入系统分配给JVM的内存区,然后执行引擎解释或编译类文件,再由即时编译器将字节码转化为机器码。
***隐藏网址***
扩展资料:
虚拟机资源涉及多个方面:CPU、内存、网络以及磁盘。在规划虚拟机时应该考虑这些资源之间的关系,否则,分配的资源不合理将导致虚拟机内的应用程序性能表现不佳。
CPU:
虚拟机每个vCPU只运行在一个物理核心之上,因此CPU频率越高虚拟机的运行速度也就越高,vCPU数量越多有助于提升应用的性能表现。
一个比较复杂的因素就是在ESXi服务器内,所有的虚拟机共享使用物理CPU。ESXi服务器的核心数越多,每个vCPU获得的核心份额也就越大,因此多核心的性能表现要强于核心频率高但数量少的情况。
如果虚拟机需要占用大量的CPU时间,那么可以考虑为虚拟机分配第二个vCPU,但是,为虚拟机分配两个以上vCPU并不一定让应用运行的更快,因为只有多线程应用才能有效地使用多个vCPU。
RAM:
ESXi服务器内RAM资源通常有限,因此在给虚拟机分配RAM时需要格外小心。VMkernel在处理RAM时非常巧妙;允许虚拟机使用ESXi服务器所有的物理内存而且会尽量避免占用物理内存却没有真正使用的情况。
物理内存被完全用完后,VMkernel必须确定哪些虚拟机能够保留物理内存,哪些虚拟机要释放物理内存。这称之为“内存回收”。当虚拟机占用的物理内存被回收后,存在的一个风险就是会对虚拟机的性能造成影响。虚拟机被回收的内存越多,相应的风险也就越大。
最明智的是只为虚拟机分配完成工作所需要的内存。分配额外的内存将会增加回收风险。另一方面,当虚拟机操作系统将未被使用的内存用作磁盘缓存时,将会显著降低对磁盘系统的性能要求,所以这里有一个折衷问题。
对于数据库服务器以及VDI桌面来说,为虚拟机分配更多的内存往往更划算—在一台ESXi服务器上运行更少的虚拟机—而不是购买高性能的磁盘阵列。关键在于针对虚拟机的负载分配足够多内存而且没有浪费。
参考资料:
百度百科-虚拟机
深入探索Java工作原理:JVM,内存回收及其他
Java语言引入了Java虚拟机 具有跨平台运行的功能 能够很好地适应各种Web应用 同时 为了提高Java语言的性能和健壮性 还引入了如垃圾回收机制等新功能 通过这些改进让Java具有其独特的工作原理
.Java虚拟机
Java虚拟机(Java Virtual Machine JVM)是软件模拟的计算机 它可以在任何处理器上(无论是在计算机中还是在其他电子设备中)安全兼容地执行保存在 class文件中的字节码 Java虚拟机的 机器码 保存在 class文件中 有时也可以称之为字节码文件
Java程序的跨平台特性主要是指字节码文件可以在任何具有Java虚拟机的计算机或者电子设备上运行 Java虚拟机中的Java解释器负责将字节码文件解释成为特定的机器码进行运行 因此在运行时 Java源程序需要通过编译器编译成为 class文件
Java虚拟机的建立需要针对不同的软硬件平台来实现 既要考虑处理器的型号 也要考虑操作系统的种类 由此在SPARC结构 X 结构 MIPS和PPC等嵌入式处理芯片上 在UNIX Linux Windows和部分实时操作系统上都可实现Java虚拟机
.无用内存自动回收机制
在程序的执行过程中 部分内存在使用过后就处于废弃状态 如果不及时进行回收 很有可能会导致内存泄漏 进而引发系统崩溃 在C++语言中是由程序员进行内存回收的 程序员需要在编写程序时把不再使用的对象内存释放掉 这种人为管理内存释放的方法往往由于程序员的疏忽而致使内存无法回收 同时也增加了程序员的工作量 而在Java运行环境中 始终存在着一个系统级的线程 专门跟踪内存的使用情况 定期检测出不再使用的内存 并自动进行回收 避免了内存的泄露 也减轻了程序员的工作量
.代码安全性检查机制
安全和方便总是相对矛盾的 Java编程语言的出现使得客户端计算机可以方便地从网络上上传或下载Java程序到本地计算机上运行 但是如何保证该Java程序不携带病毒或者没有其他危险目的呢?为了确保Java程序执行的安全性 Java语言通过Applet程序来控制非法程序的安全性 也就是有了它才确保Java语言的生存
Java字节码的执行需要经过以下 个步骤
( )由类装载器(class loader)负责把类文件( class文件)加载到Java虚拟机中 在此过程需要检验该类文件是否符合类文件规范
( )字节码校验器(bytecode verifier)检查该类文件的代码中是否存在着某些非法操作 例如Applet程序中写本地计算机文件系统的操作
( )如果字节码校验器检验通过 由Java解释器负责把该类文件解释成为机器码进行执行
注意
Java虚拟机采用 沙箱 运行模式 即把Java程序的代码和数据都限制在一定内存空间里执行 不允许程序访问该内存空间以外的内存 如果是Applet程序 还不允许访问客户端机器的文件系统
Java的运行环境
无论哪种语言都需要有它特定的运行环境 也就是平台 Java语言同样不例外 但是如何理解Java程序与硬件环境无关呢?
几乎所有的语言都需要通过编译或者解释才可以被计算机执行 但是Java有一点不同 它同时需要这两个过程 其实 也正是因为这个原因才使Java这种语言具有了平台无关性 当完成一个Java源程序后 首先 通过Java翻译程序将它编译成一种叫做字节码的中间代码 然后再由Java平台的解释器将它转换成为机器语言来执行 这一平台的核心就是JVM
Java的编译过程与其他的语言不同 像C++这样的语言 在编译时它是与计算机的硬件平台信息密不可分的 编译程序通过查表将所有指令的操作数和操作码等转换成内存的偏移量 即程序运行时的内存分配方式 目的是保证程序正常运行 而Java却是将指令转换成为一种 class的文件 这种文件不包含硬件的信息 需要执行时只要经过安装有JVM的机器进行解释 创建内存分配后再通过查表来确定一条指令所在的地址 这样就有效地保证了Java的可移植性和安全性
Java平台具有这样的特性和它的结构有关 通常一个程序运行的平台是一个硬件或者软件运行的环境 目前比较流行的是Windows XP Linux Solaris和MacOS Java的平台不太一样 它由两个部分组成 即JVM和应用程序设计接口
.JVM
JVM是Java平台的核心 为了让编译产生的字节码能更好地解释与执行 因此把JVM分成了 个部分 JVM解释器 指令系统 寄存器 栈 存储区和碎片回收区
◆JVM解释器 即这个虚拟机处理字段码的CPU
◆JVM指令系统 该系统与计算机很相似 一条指令由操作码和操作数两部分组成 操作码为 位二进制数 主要是为了说明一条指令的功能 操作数可以根据需要而定 JVM有多达 种不同的操作指令
◆寄存器 JVM有自己的虚拟寄存器 这样就可以快速地与JVM的解释器进行数据交换 为了功能的需要 JVM设置了 个常用的 位寄存器 pc(程序计数器) optop(操作数栈顶指针) frame(当前执行环境指针)和vars(指向当前执行环境中第一个局部变量的指针)
◆JVM栈 指令执行时数据和信息存储的场所和控制中心 它提供给JVM解释器运算所需要的信息
◆存储区 JVM存储区用于存储编译过后的字节码等信息
◆碎片回收区 JVM碎片回收是指将使用过的Java类的具体实例从内存进行回收 这就使得开发人员免去了自己编程控制内存的麻烦和危险 随着JVM的不断升级 其碎片回收的技术和算法也更加合理 JVM 版后产生了一种叫分代收集技术 简单来说就是利用对象在程序中生存的时间划分成代 以此为标准进行碎片回收
.Java应用程序设计接口
Java Application Programming Interface简称Java API 其中文名为Java应用程序设计接口 它是一个软件集合 其中有许多开发时所需要的控件 可以用它来辅助开发
lishixinzhi/Article/program/Java/hx/201311/26733揭秘Java虚拟机:JVM设计原理与实现详细资料大全
《揭秘Java虚拟机:JVM设计原理与实现》是2017年电子工业出版社出版的图书,作者是封亚飞。
基本介绍
- 书名 :揭秘Java虚拟机:JVM设计原理与实现
- 作者 :封亚飞
- ISBN :9787121315411
- 页数 :700
- 出版时间 :2017-06
- 开本 :16开
- 千 字 数 :942
内容简介
《揭秘Java虚拟机:JVM设计原理与实现》从源码角度解读HotSpot的内部实现机制,本书主要包含三大部分——JVM数据结构设计与实现、执行引擎机制及记忆体分配模型。 数据结构部分包括Java位元组码档案格式、常量池解析、栏位解析、方法解析。每一部分都给出详细的源码实现分析,例如栏位解析一章,从源码层面详细分析了Java栏位重排、栏位继承等关键机制。再如方法解析一章,给出了Java多态特性在源码层面的实现方式。《揭秘Java虚拟机:JVM设计原理与实现》通过直接对原始码的分析,从根本上梳理和澄清Java领域中的关键概念和机制。 执行引擎部分包括Java方法调用机制、栈帧创建机制、指令集架构与解释器实现机制。这一话题是《揭秘Java虚拟机:JVM设计原理与实现》技术含量高的部分,需要读者具备一定的汇编基础。不过千万不要被“汇编”这个词给吓著,其实在作者看来,汇编相比于高级语言而言,语法非常简单,语义也十分清晰。执行引擎部分重点描述Java原始码如何转换为位元组码,又如何从位元组码转换为机器指令从而能够被物理CPU所执行的技术实现。同时详细分析了Java函式堆叠的创建全过程,在源码分析的过程中,带领读者从本质上理解到底什么是Java函式堆叠和栈帧,以及栈帧内部的详细结构。 记忆体分配部分主要包括类型创建与载入、对象实例创建与记忆体分配,例如new关键字的工作机制,import关键字的作用,再如java.lang.ClassLoader.loadClass()接口的本地实现机制。 《揭秘Java虚拟机:JVM设计原理与实现》并不是简单地分析源码实现,而是在描述HotSpot内部实现机制的同时,分析了HotSpot如此这般实现的技术必然性。读者在阅读《揭秘Java虚拟机:JVM设计原理与实现》的过程中,将会在很多地方看到作者本人的这种思考。目录
第1章 Java虚拟机概述 1 1.1 从机器语言到Java——詹爷,你好 1 1.2 兼容的选择:一场生产力的革命 6 1.3 中间语言翻译 10 1.3.1 从中间语言翻译到机器码 11 1.3.2 通过C程式翻译 11 1.3.3 直接翻译为机器码 13 1.3.4 本地编译 16 1.4 神奇的指令 18 1.4.1 常见汇编指令 20 1.4.2 JVM指令 21 1.5 本章总结 24 第2章 Java执行引擎工作原理:方法调用 25 2.1 方法调用 26 2.1.1 真实的机器调用 26 2.1.2 C语言函式调用 41 2.2 JVM的函式调用机制 47 2.3 函式指针 53 2.4 CallStub函式指针定义 60 2.5 _call_stub_entry例程 72 2.6 本章总结 115 第3章 Java数据结构与面向对象 117 3.1 从Java算法到数据结构 118 3.2 数据类型简史 122 3.3 Java数据结构之偶然性 129 3.4 Java类型识别 132 3.4.1 class位元组码概述 133 3.4.2 魔数与JVM内部的int类型 136 3.4.3 常量池与JVM内部对象模型 137 3.5 大端与小端 143 3.5.1 大端和小端的概念 146 3.5.2 大小端产生的本质原因 148 3.5.3 大小端验证 149 3.5.4 大端和小端产生的场景 151 3.5.5 如何解决位元组序反转 154 3.5.6 大小端问题的避免 156 3.5.7 JVM对位元组码档案的大小端处理 156 3.6 本章总结 159 第4章 Java位元组码实战 161 4.1 位元组码格式初探 161 4.1.1 准备测试用例 162 4.1.2 使用javap命令分析位元组码档案 162 4.1.3 查看位元组码二进制 165 4.2 魔数与版本 166 4.2.1 魔数 168 4.2.2 版本号 168 4.3 常量池 169 4.3.1 常量池的基本结构 169 4.3.2 JVM所定义的11种常量 170 4.3.3 常量池元素的复合结构 170 4.3.4 常量池的结束位置 172 4.3.5 常量池元素总数量 172 4.3.6 第一个常量池元素 173 4.3.7 第二个常量池元素 174 4.3.8 父类常量 174 4.3.9 变数型常量池元素 175 4.4 访问标识与继承信息 177 4.4.1 aess_flags 177 4.4.2 this_class 178 4.4.3 super_class 179 4.4.4 interface 179 4.5 栏位信息 180 4.5.1 fields_count 180 4.5.2 field_info fields 185 4.7 本章回顾 205 第5章 常量池解析 206 5.1 常量池记忆体分配 208 5.1.1 常量池记忆体分配总体链路 209 5.1.2 记忆体分配 215 5.1.3 初始化记忆体 223 5.2 oop-klass模型 224 5.2.1 两模型三维度 225 5.2.2 体系总览 227 5.2.3 oop体系 229 5.2.4 klass体系 231 5.2.5 handle体系 234 5.2.6 oop、klass、handle的相互转换 239 5.3 常量池klass模型(1) 244 5.3.1 klassKlass实例构建总链路 246 5.3.2 为klassOop申请记忆体 249 5.3.3 klassOop记忆体清零 253 5.3.4 初始化mark 253 5.3.5 初始化klassOop._metadata 258 5.3.6 初始化klass 259 5.3.7 自指 260 5.4 常量池klass模型(2) 261 5.4.1 constantPoolKlass模型构建 261 5.4.2 constantPoolOop与klass 264 5.4.3 klassKlass终结符 267 5.5 常量池解析 267 5.5.1 constantPoolOop域初始化 268 5.5.2 初始化tag 269 5.5.3 解析常量池元素 271 5.6 本章总结 279 第6章 类变数解析 280 6.1 类变数解析 281 6.2 偏移量 285 6.2.1 静态变数偏移量 285 6.2.2 非静态变数偏移量 287 6.2.3 Java栏位记忆体分配总结 312 6.3 从源码看栏位继承 319 6.3.1 栏位重排与补白 319 6.3.2 private栏位可被继承吗 325 6.3.3 使用HSDB验证栏位分配与继承 329 6.3.4 引用类型变数记忆体分配 338 6.4 本章总结 342 第7章 Java栈帧 344 7.1 entry_point例程生成 345 7.2 局部变数表创建 352 7.2.1 constMethod的记忆体布局 352 7.2.2 局部变数表空间计算 356 7.2.3 初始化局部变数区 359 7.3 堆叠与栈帧 368 7.3.1 栈帧是什么 368 7.3.2 硬体对堆叠的支持 387 7.3.3 栈帧开辟与回收 390 7.3.4 堆叠大小与多执行绪 391 7.4 JVM的栈帧 396 7.4.1 JVM栈帧与大小确定 396 7.4.2 栈帧创建 399 7.4.3 局部变数表 421 7.5 栈帧深度与slot复用 433 7.6 最大运算元栈与运算元栈复用 436 7.7 本章总结 439 第8章 类方法解析 440 8.1 方法签名解析与校验 445 8.2 方法属性解析 447 8.2.1 code属性解析 447 8.2.2 LVT&LVTT 449 8.3 创建methodOop 455 8.4 Java方法属性复制 459 8.5 与 461 8.6 查看运行时位元组码指令 482 8.7 vtable 489 8.7.1 多态 489 8.7.2 C++中的多态与vtable 491 8.7.3 Java中的多态实现机制 493 8.7.4 vtable与invokevirtual指令 500 8.7.5 HSDB查看运行时vtable 502 8.7.6 miranda方法 505 8.7.7 vtable特点总结 508 8.7.8 vtable机制逻辑验证 509 8.8 本章总结 511 第9章 执行引擎 513 9.1 执行引擎概述 514 9.2 取指 516 9.2.1 指令长度 519 9.2.2 JVM的两级取指机制 527 9.2.3 取指指令放在哪 532 9.2.4 程式计数器在哪里 534 9.3 解码 535 9.3.1 模板表 535 9.3.2 汇编器 540 9.3.3 汇编 549 9.4 栈顶快取 558 9.5 栈式指令集 565 9.6 运算元栈在哪里 576 9.7 栈帧重叠 581 9.8 entry_point例程机器指令 586 9.9 执行引擎实战 588 9.9.1 一个简单的例子 588 9.9.2 位元组码运行过程分析 590 9.10 位元组码指令实现 597 9.10.1 iconst_3 598 9.10.2 istore_0 599 9.10.3 iadd 600 9.11 本章总结 601 第10章 类的生命周期 602 10.1 类的生命周期概述 602 10.2 类载入 605 10.2.1 类载入——镜像类与静态栏位 611 10.2.2 Java主类载入机制 617 10.2.3 类载入器的载入机制 622 10.2.4 反射载入机制 623 10.2.5 import与new指令 624 10.3 类的初始化 625 10.4 类载入器 628 10.4.1 类载入器的定义 628 10.4.2 系统类载入器与扩展类载入器创建 634 10.4.3 双亲委派机制与破坏 636 10.4.4 预载入 638 10.4.5 引导类载入 640 10.4.6 载入、连结与延迟载入 641 10.4.7 父载入器 645 10.4.8 载入器与类型转换 648 10.5 类实例分配 649 10.5.1 栈上分配与逃逸分析 652 10.5.2 TLAB 655 10.5.3 指针碰撞与eden区分配 657 10.5.4 清零 658 10.5.5 偏向锁 658 10.5.6 压栈与取指 659 10.6 本章总结 661在安装虚拟机的时候,那个kdump是个什么东西
1,什么是Java虚拟机 Java虚拟机(JVM)是Java Virtual Machine的缩写,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能模拟来实现的。Java虚拟机有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。 2,为什么使用Java虚拟机? Java语言最重要的特点就是可以在任何操作系统中运行。使用Java虚拟机就是为了支持与操作系统无关,在任何系统中都可以运行。 3,Java虚拟机的基本原理 Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。 我们上网时,有些网页是用java语言写的,以及一些java程序脚本等等都需要系统中有Java虚拟机时才能打开察看。不过,有些恶意网页有带病毒的java脚本程序,使电脑中毒。但毕竟是少数。如果不装的话可能中的毒就少一些,但这个虚拟机还是很实用的,很多地方都要用到,建议安装。

更多文章:
手机相片p图剪辑软件(除了美图秀秀,还有什么手机p图的app)
2026年4月27日 14:45
windows server和windows区别(windows7是基于什么平台开发的,跟windowsserver有什么区别)
2026年6月1日 03:40
流星蝴蝶剑官网(《流星蝴蝶剑手游》对手机硬件配置都有哪些要求)
2025年5月16日 02:40
nba季后赛直播免费观看,nba季后赛直播免费观看高清来发体育
2025年4月22日 00:12
共享打印机无法连接到打印机(电脑共享打印机找不到打印机怎么办)
2026年6月7日 20:10
vcredist_x86 2008(安装vcredist_x86_vc2008总是提示错误,然后回滚,安装不上)
2025年6月12日 05:20
机锋市场软件下载(如何在apps Samsung里下载软件)
2025年6月1日 04:10















