HotSpot虚拟机-程序员宅基地

技术标签: JVM  jvm  内存结构  

目录

HotSpot启动模式和执行模式

HotSpot内存布局

HotSpot对象的操作

对象的创建过程

对象的访问方式


SUN的JDK版本从1.3.1开始运用HotSpot虚拟机, 2006年底开源,主要使用C++实现,JNI接口部分用C实现。HotSpot是较新的Java虚拟机,用来代替JIT(Just in Time),可以大大提高Java运行的性能。Java原先是把源代码编译为字节码在虚拟机执行,这样执行速度较慢,HotSpot将常用的部分代码编译为本地(原生,native)代码,提高了性能。

HotSpot启动模式和执行模式

HotSpot JVM参数可以分为规则参数(standard options)和非规则参数(non-standard options)。规则参数相对稳定,在JDK未来的版本里不会有太大的改动。非规则参数则有因升级JDK而改动的可能。

HotSpot启动模式有两种 server和client 默认是server模式启动, server启动慢,占用内存多,执行效率高,适用于服务器端应用。client启动快,占用内存小,执行效率没有server快,默认情况下不进行动态编译,适用于桌面应用程序。JRE安装目录下lib/jvm.cfg文件中可查看启动模式:

--client模式默认关闭,server模式默认开启
-server KNOWN
-client IGNORE

HotSpot包括一个解释器和两个编译器,执行模式:解释与编译混合执行模式、纯解释执行模式、纯编译模式。

编译器:java源代码被编译器编译成class文件(字节码),java字节码在运行时可以被动态编译(JIT)成本地代码(前提是解释与编译混合执行模式且虚拟机不是刚启动时)。

解释器: 解释器用来解释class文件(字节码),java是解释语言(书上这么说的)。

mixed mode解释与编译混合的执行模式,默认使用这种模式。

java -version

Java HotSpot Client VM (build 14.3-b01, mixed mode, sharing)

interpreted  mode纯解释模式,禁用JIT编译。

java -Xint -version

Java HotSpot Client VM (build 14.3-b01, interpreted mode, sharing)

compiled mode纯编译模式(如果方法无法编译,则回退到解释模式执行无法编译的方法)。动态编译(compile during run-time),英文称Dynamic compilation,Just In Time也是这个意思。HotSpot对bytecode的编译不是在程序运行前编译的,而是在程序运行过程中编译的。
HotSpot里运行着一个监视器(Profile Monitor),用来监视程序的运行状况。java字节码(class文件)是以解释的方式被加载到虚拟机中(默认启动时解释执行)。 程序运行过程中,那一部分运用频率大,那些对程序的性能影响重要。对程序运行效率影响大的代码,称为热点(hotspot),HotSpot会把这些热点动态地编译成机器码(nativecode),同时对机器码进行优化,从而提高运行效率。对那些较少运行的代码,HotSpot就不会把他们编译。

java -Xcomp -version

Java HotSpot Client VM (build 14.3-b01, compiled mode, sharing)

HotSpot对字节码有三层处理:不编译(字节码加载到虚拟机中时的状态。也就是当虚拟机执行的时候再编译),编译(把字节码编译成本地代码。虚拟机执行的时候已经编译好了,不要再编译了),编译并优化(不但把字节码编译成本地代码,而且还进行了优化)。至于那些程序那些不编译,那些编译,那些优化,则是由监视器(Profile Monitor)决定。

动态编译器也在许多方面比静态编译器优越。静态编译器通常很难准确预知程序运行过程中究竟什么部分最需要优化。函数调用都是很浪费系统时间的,因为有许多进栈出栈操作。因此有一种优化办法,就是把原来的函数调用,通过编译器的编译,改成非函数调用,把函数代码直接嵌到调用出,变成顺序执行。面向对象的语言支持多态,静态编译无效确定程序调用哪个方法,因为多态是在程序运行中确定调用哪个方法。

HotSpot内存布局

在HotSpot虚拟机中对象的内存布局分为以下3块区域:对象头(Header)、实例数据(Instance Data)、对齐填充(Padding)

对象头

对象头记录了对象在运行过程中所需要使用的一些数据:哈希码、GC 分代年龄、锁状态标志、线程持有的锁、偏向线程 ID、偏向时间戳。

对象头可能包含类型指针,通过该指针能确定对象属于哪个类。如果对象是一个数组,那么对象头还会包括数组长度。

实例数据

实例数据部分就是成员变量的值,其中包括父类成员变量和本类成员变量。

对齐填充

用于确保对象的总长度为8字节的整数倍。HotSpot VM的自动内存管理系统要求对象的大小必须是 8字节的整数倍。而对象头部分正好是8字节的倍数(1 倍或 2 倍),因此,当对象实例数据部分没有对齐时,就需要通过对齐填充来补全。对齐填充并不是必然存在,也没有特别的含义,它仅仅起着占位符的作用。

HotSpot对象的操作

对象的创建过程

类加载检查

虚拟机在解析.class文件时,若遇到一条new指令,首先它会去检查常量池中是否有这个类的符号引用,并且检查这个符号引用所代表的类是否已被加载、解析和初始化过。如果没有,那么必须先执行相应的类加载过程。

为新生对象分配内存

对象所需内存的大小在类加载完成后便可完全确定,接下来从堆中划分一块对应大小的内存空间给新的对象。分配堆中内存有两种方式指针碰撞和空闲列表

指针碰撞
如果Java堆中内存绝对规整(说明采用的是“复制算法”或“标记整理法”),空闲内存和已使用内存中间放着一个指针作为分界点指示器,那么分配内存时只需要把指针向空闲内存挪动一段与对象大小一样的距离,这种分配方式称为“指针碰撞”。

空闲列表
如果 Java堆中内存并不规整,已使用的内存和空闲内存交错(说明采用的是标记-清除法,有碎片),此时没法简单进行指针碰撞, VM 必须维护一个列表,记录其中哪些内存块空闲可用。分配之时从空闲列表中找到一块足够大的内存空间划分给对象实例。这种方式称为“空闲列表”。

初始化

分配完内存后,为对象中的成员变量赋上初始值,设置对象头信息,调用对象的构造函数方法进行初始化。至此,整个对象的创建过程就完成了。

对象的访问方式

所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在堆栈中分配的。也就是说在建立一个对象时两个地方都分配内存,在堆中分配的内存实际建立这个对象,而在堆栈中分配的内存只是一个指向这个堆对象的指针(引用)而已。 那么根据引用存放的地址类型的不同,对象有不同的访问方式。

句柄访问方式

堆中需要有一块叫做“句柄池”的内存空间,句柄中包含了对象实例数据与类型数据各自的具体地址信息。

引用类型的变量存放的是该对象的句柄地址(reference)。访问对象时,首先需要通过引用类型的变量找到该对象的句柄,然后根据句柄中对象的地址找到对象。

直接指针访问方式

引用类型的变量直接存放对象的地址,从而不需要句柄池,通过引用能够直接访问对象。但对象所在的内存空间需要额外的策略存储对象所属的类信息的地址。

需要说明的是,HotSpot 采用第二种方式,即直接指针方式来访问对象,只需要一次寻址操作,所以在性能上比句柄访问方式快一倍。但像上面所说,它需要额外的策略来存储对象在方法区中类信息的地址。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xing_jian1/article/details/122949080

智能推荐

ModuleNotFoundError: No module named ‘_ctypes‘的解决办法_modulenotfounderror: no module named '_ctypes-程序员宅基地

文章浏览阅读8.2k次,点赞7次,收藏12次。问题描述在linux上安装好python3.8.2后,要安装一个第三方依赖库,在安装此依赖库的时候报了ModuleNotFoundError: No module named '_ctypes'的error,导致安装失败,字面上理解就是缺少_ctypes这个module执行命令 yum install libffi-devel进行安装然后从"./configure …"重新安装python3.8.2所有前置依赖安装yum -y install zlib-devel bzip2-devel open_modulenotfounderror: no module named '_ctypes

PyQt5 界面展示图片问题(QtGui.QPixmap)-程序员宅基地

文章浏览阅读2.4w次,点赞18次,收藏97次。PyQt5问题总结之QPixmap界面展示图片有两种方式:1,通过图片的地址路径加载图片并显示example:from PyQt5.Qt import QtGui# 图片路径img_path="image_path.jpg"# 设置展示..._qtgui.qpixmap

mysql LAST_INSERT_ID() 为空值的原因_oceanbase插入id为空-程序员宅基地

文章浏览阅读690次。1.插入的id不为mysql自增主键,则无法查询到mysql官方文档中说道,LAST_INSERT_ID()会获取最后一个生成的AUTO_INCREMENT的值With no argument, LAST_INSERT_ID() returns a BIGINT UNSIGNED (64-bit) value representing the first automatically generated value successfully inserted for an AUTO_INCREMENT _oceanbase插入id为空

CTF-密码学相关_密钥eyo-程序员宅基地

文章浏览阅读5.8k次,点赞7次,收藏41次。参考:千千秀字、百度百科、CTF编码和加密总结、CTF常见编码和加密特征 、CTF中Crypty(密码类)入门必看目录字符编码1.ASCII编码2.Unicode编码3.UTF-8编码4.UTF-16编码5.进制转换6.URL字符编码7.摩斯电码8.Base64/32/16编码9.shellcode编码10.Quoted-printable编码..._密钥eyo

呦西震惊--datatables如何拿到关联对象中的值_data, type, row, meta 获取对象-程序员宅基地

文章浏览阅读266次。例如在json数据中user[{‘name’:‘zhangsan’,‘sex’:‘男’},class[{‘classname’:‘ruanjian’}]]要想拿到user关联的class的数据,先看看一下参考:function render( data, type, row, meta )描述:如果做为一个function,那么每当Datatables从columns中的cell获取数据时,都需要执行该方法。 注意,该方法会被多次调用,根据不同的数据类型,比如sorting(排序)、filter_data, type, row, meta 获取对象

前端学习笔记——XHTML及HTML5新变化_vs中doctype:xhtml5是什么意思-程序员宅基地

文章浏览阅读310次。一、XHTML介绍1.XHTML简介  (1)XHTML是可扩展的超文本标记语言  (2)三种XHTML文档类型    STRICT(严格类型)    TRANSITIONAL(过渡类型)    FRAMESET(框架类型)2.XHTML元素  XHTML元素必须正确正确嵌套、始终关闭、小写、有一个根元素3.XHTML属性  XHTML属性必须小写、用引号包围、最小化是禁止的..._vs中doctype:xhtml5是什么意思

随便推点

最近很火的京东、天猫超市飞天茅台抢购是怎么回事,从原理流程给你们分析一波_京东90016-程序员宅基地

文章浏览阅读1.2w次,点赞15次,收藏59次。最近很火的京东、天猫超市飞天茅台抢购是怎么回事,从原理流程给你们分析一波文章目录京东茅台介绍天猫茅台介绍京东抢购流程简单明了的流程图null和90008服务器压力部分通俗易懂的锁其他原因天猫抢购流程简单明了的流程图令牌的方式抢购茅台为什么天猫的要公平一些最后本文数据都没有证据支撑,皆为作者遐想。如有雷同,均为巧合。京东茅台介绍最近茅台抢购突然就火了,莫名其妙。而最初的京东脚本抢购作者,留下一句,一个被京东警告截图,便销声匿迹。但是他掀起的波澜还在继续。那7k份在github上fork的代码,将生_京东90016

Spring Boot自动配置原理_springboot自动装配和自动配置-程序员宅基地

文章浏览阅读5.7k次,点赞4次,收藏4次。Spring Boot自动配置原理(源码分析)_springboot自动装配和自动配置

spark面试题总结-程序员宅基地

文章浏览阅读7.5k次,点赞5次,收藏77次。spark面试基础篇_spark面试题

实验7-1-13 装箱问题 (20 分)_-20 装箱问题 分数 20 作者 ds课程组 单位 浙江大学 假设有n项物品,大小分别为s 1-程序员宅基地

文章浏览阅读242次。实验7-1-13 装箱问题 (20 分)假设有N项物品,大小分别为s ​1 ​​ 、s ​2 ​​ 、…、s ​i ​​ 、…、s ​N ​​ ,其中s ​i ​​ 为满足1≤s​i ​​ ≤100的整数。要把这些物品装入到容量为100的一批箱子(序号1-N)中。装箱方法是:对每项物品,顺序扫描箱子,把该物品放入足以能够容下它的第一个箱子中。请写一个程序模拟这种装箱过程,并输出每个物品所在的箱子序号,以及放置全部物品所需的箱子数目。输入格式: 输入第一行给出物品个数N(≤1000);第二行给出_-20 装箱问题 分数 20 作者 ds课程组 单位 浙江大学 假设有n项物品,大小分别为s 1

一些重要的C和C++开发框架和开源工具_用c和c++写的开源工具-程序员宅基地

文章浏览阅读2.9k次。1、值得学习的C语言开源项目1.1. WebbenchWebbench是一个在linux下使用的非常简单的网站压测工具。它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以模拟3万个并发连接去测试网站的负载能力。Webbench使用C语言编写, 代码实在太简洁,源码加起来不到600行。 下载链接:http://home.tiscali.cz/~cz2105_用c和c++写的开源工具

18.10.29 POJ 3691 DNA repair(AC自动机+dp)-程序员宅基地

文章浏览阅读99次。描述Biologists finally invent techniques of repairing DNA that contains segments causing kinds of inherited diseases. For the sake of simplicity, a DNA is represented as a string containing cha...

推荐文章

热门文章

相关标签