a java虚拟机_Java虚拟机

内存分配以及回收

Java虚拟机运行时数据区,分为以下几个模块,包含所有线程共有的数据区和线程单独享有的数据区。

6cd52e26e3861f5c750a26eb591d2ca9.png

程序计数器:字节码行号,通过这个计数器来选取下一条需要执行的指令,线程独有。

虚拟机栈:线程私有。方法在执行时会创建一个栈帧,用于存储局部变量表等。局部变量表中存放了编译器可知的基本数据类型、对象引用、returnAddress(指向了一条字节码指令的地址)

本地方法栈:与虚拟机栈类似,只不过这个地方是为native方法服务。

堆:线程共用。存放对象实例。

方法区:线程共用。存储已经被虚拟机加载的类信息、常量、静态变量等。

运行时常量池:用于存放编译期生成的字面量和符合引用。字面量就是我们所说的常量概念,如文本字符串、被声明为final的常量值等。符号引用是一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能无歧义地定位到目标即可,一般包括下面三类常量:类和接口的全限定名、字段的名称和描述符、方法的名称和描述符。

56212ceb2129a86a7a847585dfd2ded0.png

JVM通过根搜索算法来判定对象是否可以回收,一般对于不能从根(GC Roots)搜索到的对象是可以被回收的。

能够被作为GC Roots对象有:虚拟机栈本地变量表中引用的对象(也就是正在调用的方法中引用的);方法区中静态属性或常量引用的对象;本地方法栈引用的对象。

可以被回收的对象并不一定绝对被回收,JVM先做一次标记和筛选,把那些覆盖了finalize方法的对象筛选出来然后触发finalize方法,如果在finalize方法中对象复活,则不回收,否则回收,且finalize方法仅会被触发一次。

垃圾回收算法

标记-清除:把标记为待回收的对象空间清除,容易造成大量空间碎片;

复制算法:将内存分为三个区域,一个较大的eden区和两个较小的survivor区。每次GC都把存活的对象挪到其中一个servivor区,然后把eden全部清除。只对每次GC时存活对象较少时比较有效,适用于新生代;

标记-整理:把标记后存活的对象向一个方向移动,然后清除其它空间。比较适合老年代。

内存分配与回收策略

对象默认优先分配在新生代;

大对象直接分配到老年代;

长期存活的对象转移到老年代:虚拟机给每个对象定义一个对象年龄,没发生一次minor GC,年龄就增加一次,超过默认值之后就会进入到老年代。

动态对象年龄判定:对象不一定是必须到了默认年龄才能进入老年代,如果一个eden区中所有相同年龄的对象大小综合超过eden一半的空间,那么大于等于这个年龄的对象也会进入老年代。

类文件结构

class文件是二进制组成的,class有两种数据类型:无符号数和表。

无符号数是基础数据类型,其中u1表示1个字节、u2表示2个字节(一个字节8个bit,而4个bit可以表示1个16进制的数,也就是说1个字节可以用2个16进制数表示);

表是由多个无符号数或其它表构成的。

05d94206c3594da95caa8b7585678a57.png

magic是4个字节,也就是8个16进制数,固定为CAFEBABE;后面分别是两个版本号。

常量池:跟着版本号之后的就是常量池(字面量和符号引用)。由于无法确认一个类中常量池有多少常量,所有先有一个值来标志有多少个,然后再是常量具体信息。

访问标志:常量池之后跟着的是2个字节的访问标志。需要被标志的内容包括:是否public、是否final、是否abstract、是类或接口

访问标志之后是类索引(用于确定该类的全限定名)、父类索引(用于确定父类的全限定名)、接口所有集合(实现的接口可能不止一个)

字段表集合:描述接口或类中声明的变量,包含类变量和实例变量。

方法表集合:描述类或接口中声明的fangfa。

属性表结合:

code属性:java方法体中的代码经javac编译后会存储在code属性中(接口中方法或抽象方法没有code属性)

Exceptions属性:列举出方法throws后面抛出的异常;

其它各属性不再一一列举。

类加载机制

93b2688c166dd49a1f5b1bdcd642b66e.png

类加载的时机

主动引用的几种情况才会加载(前提是此类没有被加载过)

new一个对象、引用类的static变量(final变量除外)、调用类的static方法;

对类进行反射调用时;

初始化一个类时,如果父类没有被初始化,则先初始化父类;

虚拟机启动时,初始化包含main方法的那个类

被动引用不会触发初始化

调用父类静态方法,不会初始化子类;

通过数组定义引用类,不会触发初始化;

引用静态常量不会触发。

加载过程

通过一个类全限定名获取定义此类的二进制字节流(一般是class文件)

将二进制字节流转化为方法区中的运行时数据结构

在内存(堆)中生成这个类的Class类的对象,作为方法区这个类的各个数据的访问入口

连接过程

验证阶段:文件格式验证(是否符合Class文件规范)、元数据验证(是否符合java语法规范)、字节码验证(确保语义是符合逻辑的)、符合引用验证。

准备阶段:正式为类变量分配内存并设置初始值。

有两点需要注意:

一,此处只为类变量分配内存(static修饰的),不包含实例变量;

二,设置的初始值是这个类型的0值,不是实际值(但被final修饰的赋的就是实际值)

解析阶段:将符合引用替换为直接引用

初始化过程

初始化过程主要是执行类构造器方法

方法主要是手机所有类变量的赋值动作,和静态语句块(staic {});

虚拟机会保证方法在父类中先调用,这样说明父类的static语句块要比子类的static变量赋值操作先执行,以下代码中,字段B的值将会是2

2dbcceda3bec6fabdb77e30e1d6edd1e.png

这也说明了一个问题:new一个对象时,静态变量赋值和静态语句块会在类的构造方法前执行。

类加载器

比较两个类对象是否相等,只有加载两个类加载器的完全一样,才有意义;

如果一个类加载器收到一个类加载请求,它首先会请求委派给父类加载器完成,父类无法完成时,子类加载器才进行加载。

虚拟机字节码执行引擎

ca376056adb3c5d5d7ab457cb1150fa5.png

运行时栈帧结构

局部变量表:存放方法参数和局部变量。每个变量以slot为单位,slot可以复用

c8c3ebf1be44b79af7d616544b2866b4.png注意,如果没有int a = 0这一行代码,placeholder是不会被回收的,因为如果不加这行代码,就没有任何对局部变量表的读写操作,这个slot就不会被占用。

操作数栈:方法执行过程中,会有各种字节码出栈入栈

动态链接:一部分符合引用在类加载时转化为直接引用,这是静态机械;而一部分则是运行时转化为直接应用,这叫动态链接

方法调用和分派

所有的方法在Class文件中都是一个符合引用,而一部分方法在类加载时就直接解析为直接引用。这种方法必须是“编译时已知,运行时不可变”,就是静态方法和私有方法两大类

静态分派:依赖静态类型来定位方法执行版本称为静态分派,典型应用是重载。

234e95b7ce71c67c6ce366d343df5361.png

Human是静态类型,后面的Man和Women则是实际类型。

静态类型在编译器可知,而动态类型则是在运行时才能知道。

动态分派:运行期间根据实际类型来确定方法执行版本,典型应用是覆盖。

3903e3d3316b4666fda87e66da1cf623.png

结果是

f528178f2453742753b96e2eb6feda5f.png

内存模型及线程安全

68ec2b81c3424a05f31bf7a6b45102b1.png

JMM规定所有内存都存储于主内存中,每条线程还有自己的工作内存。

变量的读取、赋值操作必须在工作内存中进行。

内存直接的交互操作,主要有以下8种操作:

ac3a3d01b38ffaefa389f626c2fa13b5.png

fa4d893eccf01548d4281ffb7d48aed6.png

8种操作需要满足以下规则

5cb0e72b678616646aabf6f542781250.png

volatile关键字

volatile关键字保证了变量的所有线程的可见性,但并非是线程安全的。

两种情况下是线程不安全的:

一,变量依赖于自身(比如i++之类的)

二,变量依赖于其它变量(比如i=a+3)

volatile禁止语义重排序

volatile的具体实现

15f980bb20445dec25da400ed7e6ecf6.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/559815.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java tostring的用处_JAVA的tostring()方法的作用是什么呢?

展开全部1.toString方法Object类具有一个toString()方法,你创建的每个类都会继承62616964757a686964616fe4b893e5b19e31333365666236该方法。它返回对象的一个String表示,并且对于调试非常有帮助。然而对于默认的toString()方法往往不能满足需…

java软件工程_java复习

计算机一些物理装置按系统结构的要求构成一个有机整体为计算机软件运行提供物质基础。计算机硬件:CPU、主板(motherboard)、内存(memory)、电源、主机箱、硬盘、显卡、键盘、鼠标、显示器等IO:input输入(鼠标键盘)、output输出(显示器音响)冯诺依曼体系结…

java getparametermap_重写getParameterMap后,报错 ,

想做个参数过滤功能,如何修改,或者其他实现方式ServletExcludeHadler类在HttpServletRequestWrapper类里重写了getParameterMap现在报错java.lang.ClassCastException: org.apache.catalina.util.ParameterMap cannot be cast to java.util.HashMapat co…

java 抽样_Java编程实现二项分布的采样或抽样实例代码

本文研究的主要是Java编程实现二项分布的采样或抽样,下面是详细实现代码。如下程序为n100,p0.9的二项分布采样,共采样10000次package function;import org.apache.commons.math3.distribution.BetaDistribution;import org.apache.commons.ma…

java中什么是 伪共享_【Java】聊聊多线程中的伪共享现象

首页专栏java文章详情0聊聊多线程中的伪共享现象小强大人发布于 1 月 27 日什么是伪共享?讲伪共享之前,让我们先乘坐时光机,回到大学课堂,来重温下计算机组成原理的基础知识。我们知道,CPU和内存的运行速度相差很大&am…

新闻资讯java开发_新闻资讯app开发的功能与意义

获取新闻的目的因人而异,但对获取新闻的需求是一样的。现在是移动互联网的时代。人们不再想依靠传统的手段,而把便利作为获取服务的核心。因此,开发新闻咨询app是必要的。其到来不仅意味着获得新闻登上新的阶梯,还因为画出了圆满的…

php实时上传多张图片,PHP实现多张图片上传预览功能

PHP实现多张图片上传预览功能,支持左右移动图片切换位置、删除图片,限制图片上传的数量等-向左移动图片function reverse_left(obj) {var obj_li obj.parents("li");var obj_prev obj_li.prev("li");if (obj_prev.hasClass("…

centos php 默认安装目录,centos系统中的软件安装目录在哪

centos系统中软件的默认安装目录一般在/usr/local或者/opt中。我们还可以通过whereis命令来查看软件的实际安装路径。命令:whereis功能介绍:在特定目录中查找符合条件的文件。这些文件的烈性应属于原始代码,二进制文件,或是帮助文…

php atlas,apache atlas是什么

Atlas是一组可伸缩和可扩展的核心基础治理服务——使企业能够有效和高效地满足Hadoop中的遵从性需求,并允许与整个企业数据生态系统进行集成。Apache Atlas为组织提供开放的元数据管理和治理能力,以建立其数据资产的目录,对这些资产进行分类和…

php2588,搞清楚一下必胜2588z和2582z哪个好点?都有些什么区别?内幕评测分析

这二个必胜2588z和2582z区别不是很大的哈,款式和配置是差不多的,只是必胜2582Z 2052Z更强一些,看个人需要吧,不过家用的话,这两款都是可以的,我自己用的是必胜2582Z 2052Z,款式多大气的&#xf…

超表面透镜相位matlab,基于超透镜的小F数大景深镜头的设计方法及应用与流程...

本发明涉及基于超透镜的小f数大景深镜头的设计方法及应用。背景技术:监控系统中采用的透镜往往要求具有尽量高的成像分辨率和尽量大的景深,通常情况下,高分辨率的透镜一般具有较小f数,大的景深又要求焦距较短。但是利用传统透镜的…

php等级证书,php银行开放平台接口1:php 对cer证书处理

做一个银行接口要进行证书解析和签名,然后验证获token银行开放平台提供了2个证书public.cer 证书 :里面只有公钥200090491595.pfx证书 :里面有公钥和私钥这里专门做public.cer的说明和处理,.cer为扩展的证书,就是一个x…

oracle 9i hwm,Oracle 10g HWM原理及性能优化

摘 要: HWM(High Water Mark)是表中已经使用过的存储空间与未使用过的存储空间之间的分界线,HWM对全表扫描的性能有非常大的影响。当全表扫描时,Oracle会读取HWM下所有的块,即使这些块中有很多是空块,空块的存在,也即是…

五款救急的linux文件恢复软件,五款救急的Linux文件恢复软件

BKJIA快译】文件有备份,啥子也不愁!文件无备份,啥子也白搭。但是,面对突如其来的悲剧,文件恢复软件来帮忙时可以尽量最小化减小损失。下面Linux用户需知的5款文件恢复软件:#1,Ddrescue主页&…

linux 网络路径中网络协议栈有几种,linux网络路径中网络协议栈有几种

网络路径有很多种,其中的linux网络路径是最常用的,也是最需要关注的。linux网络路径中网络协议栈有几种?电脑新装系统漏洞应不应该修复?了解网络安全常识,首先就要了解计算机网络安全有哪些基本注意事项,下面佰佰安全网小编就带…

华硕T100 安装linux,【华硕T100TA3740评测】双硬盘组合 华硕T100TA挑战存储极限(全文)_华硕 T100TA3740_笔记本评测-中关村在线...

一直以来产品线的细化和完善完全是在于对于行业空白的填补而实现的,比如笔记本电脑的推出就为了弥补人们移动办公的空白,而平板电脑的推出是为了弥补智能手机和笔记本电脑市场的空白。2010年推出的iPad可谓创造了一个全新的品类——平板电脑,…

用四位led数码管作显示器的篮球比赛24秒计时器求c语言代码,单片机编程控制LED七段数码管作显示的篮球赛计时计分系统...

本次设计用由AT89C51编程控制LED七段数码管作显示的球赛计时计分系统。系统应具有赛程定时设置,赛程时间暂停,及时刷新甲、乙双方的成绩以及赛后成绩暂存等功能。内容包括:显示、键盘、时钟等内容设计说明2.1需求分析2.1.1 计分系统分为“A队…

android 获取对话框对象,Android 基本Dialog和自定义Dialog

Android 基本Dialog和自定义DialogDialog类是对话框的基类,但你应该避免直接实例化Dialog ,可以使用子类1.AlertDialog 此对话框可以显示标题,最多三个按钮,可选择列表或自定义布局View.2.DatePickerDialog或TimePickerDialog 此对话框带有允…

android inset 标签,android – 有几个WindowInsets?

WindowInsets描述了一组窗口内容的插图.换句话说,WindowInsets有一个可用的应用程序区域(并有其他信息,如isRound).可用区域不包括StatusBar和NavigationBar的Rect.如果您只想知道StatusBar和NavigationBar的高度,请查看this.你可以得到如下的WindowInsets.以下示例使用WindowI…

android toolbar源码解析,深入理解Android 5.0中的Toolbar

环境说明:Android Studio 2.0V7包版本:com.android.support:appcompat-v7:23.4.0compileSdkVersion 23buildToolsVersion "24.0.0"Toolbar 引入使用XML布局中加入:android:id"id/toolbar"android:layout_width"matc…