在类中用class时数据是共有还是私有_jvm学习笔记之class文件的加载、初始化

5d1ffda1542c6c67ea8627ae2798af8b.png

编写的java文件在要真正运行时,会首先被编译成 “.class"结尾的二进制文件,然后被虚拟机加载。那么在虚拟机中一个class文件要成为java实例,需要经历好几个步骤:

1、装载:装载阶段由三个基本动作完成,要装载一个类型,java虚拟机必须:

(1)通过该类型的完全限定名,产生一个代表该类型的二进制数据流

(2)解析这个二进制数据流为方法区内的内部数据结构

(3)创建一个表示该类型的java.lang.Class的实例

***当时用new关键字创建一个对象时,该类的数据结构存放在方法区中,new出的对象存放在堆中

二进制的数据流可由以下方式产生:

1、从本地加载一个java class 文件

2、通过网络上下载一个class文件

3、从一个zip、jar、或者其他文档中提取class文件 等…

2、验证:类被装载后,就要准备连接,连接的第一步是验证——确认类型符合java语言规范,并且不会危及虚拟机的完整性。

类型的检查——确保除了Object之外的每个类都必须有一个超类,并确保该类的所有超类都已经被装载了

类之间的二进制兼容检查——检查final类不能用于子类、检查final类的方法不能被覆盖、确保子类和超类之间没有不兼容的方法

——检查所有的常量池入口相互之间一致

——检查常量池中的所有特殊字符串是否符合格式

——检查字节码的完整性(最为复杂的一步)

3、准备:在准备阶段java虚拟机为类变量分配内存,设置默认初始值,但在到达初始化之前,类变量都没有被初始化为真正的初始值。即:我们在类中声明 int a = 3;但在这一步,a的致被赋予类型的默认值 0 int a =0;java虚拟机不支持boolean 类型,在内部,boolean变量会被默认的设置为int类型的0,即初始化成false.

4、解析:经过验证和准备之后,就进入了解析过程。解析就是在类型的常量池中寻找类、接口、字段、以及方法的符号引用,把这些引用替换成为直接引用的过程

5、初始化:初始化就是赋予一个变量真正的初始值

如我们定义 private static int a=1; 此时就是给a赋值1

二、动态链接和解析

class文件把所有的符号引用保存在——常量池中,每一个 class文件都有一个常量池。每一个被虚拟机装载类或者接口 都有一个内部版本的常量池,被称为运行时常量池。

常量池的解析——当程序运行时,某个特定的符号引用要被使用, 首先要被解析。解析过程就是根据 符号引用查找到实体, 在把符号引用替换成为 直接引用的过程。每个符号引用都只被解析一次

早解析——预先解析所有的符号引用,从初始类开始,到后续的各个类,知道所有的符号引用都被解析。

迟解析——在访问每一个符号引用的最后一刻才去解析。(也可选择两种情况之间的折衷策略)

——程序执行都是在第一次 实际访问一个符号引用时才会抛出错误,对于用户来说,看上去都是 迟解析

——java虚拟机会把所有具有相同字符串顺序的字符串文字处理成一个String对象。即:如果有多个类使用同一个字符串“Hello”,java虚拟机只会创建一个具有“Hello ”值的String对象 来表示所有的字符串文字。

——任何的byte、short、char的值在被压入栈中时, 都会先被转换成int型

——涉及byte、short、char的运算操作会首先把他们都转换成int类型,进行计算然后得到int结果,如果需要byte等结果,需要进行显示转换。

——java虚拟机中内存只能以对象形式在堆中进行分配,如果需要可考虑基本类型包装器

——java所使用的同步机制是监视器,java中的监视器支持两种线程:互斥和协作。java虚拟机是通过锁来实现互斥,是通过Object的wait和notify方法来实现协作

——只有当绝对确定等待区中只有一个线程挂起的时候才应使用notify,只要存在同时有多个线程挂起的可能性,就应该使用notify all。否则可能导致某个特定的线程在等待区中等待时间过长,甚至永远就不会苏醒。

——堆和方法区是被所有线程共享的

——会被多线程访问的两种数据:保存在堆中的实例变量,保存在方法区中的类变量

——不需要进行保护的变量:java栈中的局部变量,该数据是拥有该线程的线程私有的

——当虚拟机装载一个class文件的时候,会创建一个java.lang.Class类的实例。当锁住一个类的时候,其实就是锁住那个类的Class对象。

jvm内置的三大类加载器

BootStrap类加载器(BootStrapClassLoader):根类加载器。该加载器没有父加载器,负责加载虚拟机的核心类库,如:java.lang.*等,java.lang.Object就是由根加载器加载的

Extension 类加载器(ExtClassLoader):它的父加载器为根加载器,也就是上面那个。它从java.ext.dirs系统属性所指定的目录中加载类库,或者从jdk的安装目录jre/lib/ext子目录中加载类库。该类是纯java类是lava.lang.ClassLoader类的子类

System系统类加载器(AppClassLoader),也称为应用类加载器,其父加载器为扩展类加载器,上面那个。它从环境变量classpath中多指定的目录中加载。它是用户自定义类加载器的默认父加载器,该类是纯java类是lava.lang.ClassLoader类的子类

**注意:使用Class.forName("com.test.Test1")进行类装载时,会自动执行类中的静态代码块,但不会执行构造方法

使用loadClass("com.test.Test1")进行装载时,不会自动执行其中的静态代码块,也不会执行构造方法

***:同一个类,由两个不同的类加载器去加载,会被认为是两个不相同的类,在方法区中会有两份该类的类信息

只有使用启动类加载器加载的类,比如:java.lang.Strong、java.lang.Object 等类,在方法区中只有一份类信息。

判断两个类是否相等的基础是,这两个类的类加载器是不是同一个

初始化:对于类的初始化阶段,虚拟机规范规定了5种情况下必须立即对类进行初始化

1、遇到new、getstatic、putstatic、invokestatic这四条字节码指令时,如果类之前没有进行过初始化会进行初始化。这四条字节码对应的是:new 实例、静态字段取值、静态字段赋值、静态字段调用。

2、使用java.lang.refleat包的方法进行反射调用

3、当初始化一个类时,如果发现其父类还没有被初始化,需要先初始化其父类

4、当虚拟机启动,需要执行main方法的类

5、当使用LDK1.7的动态预言支持时,如果一个java.lang.invole.MethodHandle实例的最后解析结果是REF_getStatic,REF_putStatic,REF_invokeStatic的方法句柄。

以下几种情况需要注意:

1、对于静态字段,只有直接定义这个字段的类或者接口才会被初始化,如果是通过子类引用父类中的静态字段,只会触发父类的初始化。

2、常量在编译阶段会存入调用类的常量池中,本质上并没有直接引用到定义类的常量,因此不会触发定义常量的类的初始化。备注:只有编译器能确定之的常量才会进行该操作,编译器无法确定的常量值,还是会触发目标类的初始化。

例如:public static final String uuid = UUID.randomUUID().toString(); 这行代码,当其他类在引用uuid时,会触发定义该uuid的类的初始化

3、通过数组定义来引用类,不会触发类的初始化 例如: Super[ ] s = new Super[10]; 这行代码并不会触发Super类的初始化

4、当一个接口初始化的时候,并不要求其父接口也被初始化,只有真正使用到父接口的时候才会初始化。

私信我获取更多JAVA学习资料!

————————————————

本文转载至CSDN——终南山_半仙,如有侵权请联系立删!

原文链接:https://blog.csdn.net/qq_37150258/article/details/83505011

ae87d658a6a7c2f1425a0c2898afac36.png

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

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

相关文章

所有前端都要看的2D游戏化互动入门基础知识

背景现在越来越多的公司和APP开始使用游戏化的方式去做产品了,所谓游戏化,是指在非游戏环境中将游戏的思维和游戏的机制进行整合运用,以引导用户互动和使用的方法。支付宝里面的蚂蚁庄园、蚂蚁森林,通过游戏和公益的结合实现用户的…

江苏一动物园现“旋转活马” 园方:创意来自马术训练

中新网南通1月31日电 (记者唐娟)“旋转马设备采用同时容纳六匹马的遛马器组装而成,对马匹没有任何伤害,初衷是希望给小朋友一种全新体验,这才有了这个创意项目。”1月31日,针对活马版“旋转木马”引发的热议,江苏南通森…

加快信息化建设对地方发展的_加快设计师职业发展的9种方法

加快信息化建设对地方发展的重点 (Top highlight)Over the past few months, I have had an increase in conversations with design students from various institutions, as well as early, to senior-level designers, researchers, & product managers from various co…

epoll监听文件_介绍一下 Android Handler 中的 epoll 机制?

介绍一下 Android Handler 中的 epoll 机制?目录:IO 多路复用select、poll、epoll 对比epoll APIepoll 使用示例Handler 中的 epoll 源码分析IO 多路复用IO 多路复用是一种同步 IO 模型,实现一个线程可以监视多个文件句柄。一旦某个文件句柄就…

前端工程师的一大神器——puppeteer

大家好,我是若川。欢迎加我微信 ruochuan12,长期交流学习。今天推荐神器puppeteer,我猜有挺多人不知道。文章不长,看完有空也可以试玩。我18年也写过一篇puppeteer爬取生成pdf的文章,时间真快。前端使用puppeteer 爬虫…

selenium界面元素定位

一、 Selenium界面元素定位 本文元素定位以das2为例 #导入包 from selenium import webdriver #打开火狐驱动 driverwebdriver.Firefox() #访问网址 driver.get("http://192.168.3.217:8080/das/seatlogin.jsp ") 进行web页面自动化测试,对页面上…

vue.js ui_UI / UX开发:考虑Vue.js

vue.js uiBecause sometimes we have to add logic to our concepts, and Vue makes it a whole lot easier.因为有时我们必须在概念中添加逻辑,而Vue使其变得更加容易。 FULL DISCLOSURE: THIS IS NOT A COMPLETE JAVASCRIPT OR VUE COURSE. There’s no way I co…

Silverlight学习笔记十七BingMap(三)之地图的地区标识

如果我们需要在Bing Maps中加入一个小图钉标记&#xff0c;该如何实现了&#xff1f; Bing Maps控件已经为我们提供了这个功能&#xff0c;在Microsoft.Maps.MapControl名称空间下提供了实现图钉应用的图钉层Pushpin类用该类来实现普通标识 在Xaml中添加<map:Pushpin Locati…

win10查看pcie设备_壹拓网科技解密WIN10系统使用向日葵开机棒远程开机需要设置几个地方...

向日葵开机棒&#xff0c;是一款非常好用的远程智能远程开机硬件&#xff0c;它一头接网线&#xff0c;另外一头和被开电脑接在同一个路由器下&#xff0c;不需要和被开电脑或者设备直接连接&#xff0c;当然&#xff0c;被开电脑需要有线联网&#xff0c;暂时不支持使用无线方…

如何成为公司独当一面的工程师

大家好&#xff0c;我是若川。欢迎加我微信 ruochuan12&#xff0c;长期交流学习。今天推荐黄老师的这篇文章&#xff0c;你可能看到过了&#xff0c;但值得再看一遍。之前常有小伙伴问&#xff0c;大多情况下我都会分享这篇文章。点击下方卡片关注我、加个星标&#xff0c;或者…

flex如何做响应式设计_响应式设计-您做错了!

flex如何做响应式设计Responsive design is not just about the web that automatically adjusts to different screen resolutions and resizeable images, but designs that are crucial for web performance.自适应设计不仅涉及可自动适应不同屏幕分辨率和可调整大小图像的网…

30万手表推荐_今年六十岁生日,儿子说要送只30万的手表,请问有哪些推荐?...

关注腕表部落&#xff0c;尽享腕表生活一位读者向笔者提出这样一个问题&#xff1a;今年六十岁生日&#xff0c;儿子说要送只30万的手表&#xff0c;请问有哪些推荐&#xff1f;首先要恭喜这位老爷子&#xff0c;一来是生日马上就要到了&#xff0c;二来是还有这么孝顺而且慷慨…

写 Node.js 代码,从学会调试开始

大家好&#xff0c;我是若川&#xff08;点这里加我微信 ruochuan12&#xff0c;长期交流学习&#xff09;。今天推荐这篇调试文章&#xff0c;熟悉我的读者都知道我写的源码文章都多次强调要调试&#xff0c;而且写了调试方法。点击下方卡片关注我、加个星标&#xff0c;或者查…

创建用户友好的表单

Forms are a common way to engage with users and could be a user’s first impression of your product. Since forms aren’t always the user’s favourite thing, it is essential to make filling out forms as easy as possible. Let’s go over a few tips for creati…

细节决定成败—关于.net的.dll.refresh文件

一直在做.net的项目&#xff0c;c/s的、b/s的&#xff0c;一直没有注意这个东西。众所周知&#xff0c;.net的程序生成后会在bin目录下生成.dll文件&#xff0c;而.dll.refresh这个文件从何而来呢&#xff1f;那天无聊地google了下才知&#xff0c;这个东东是在你的项目中引用第…

环境在c盘_如何给女朋友解释为什么 Windows 上面的软件都把自己安装在 C 盘

本文经授权转载自漫画编程(ID&#xff1a;mhcoding)周末&#xff0c;我在家里面看电视&#xff0c;女朋友正在旁边鼓捣她的电脑&#xff0c;但是好像并不是很顺利&#xff0c;于是就有了以下对话。计算机存储我们使用的计算机中&#xff0c;保存信息的介质有两类&#xff1a;一…

能让你纵享丝滑的SSR技术,转转这样实践

大家好&#xff0c;我是若川&#xff08;点这里加我微信 ruochuan12&#xff0c;长期交流学习&#xff09;。今天推荐这篇图文并茂的SSR技术文章。这是江西前端群里一个小伙伴的文章。群里小伙伴很多都在知名大厂&#xff0c;但他们都很低调。点击下方卡片关注我、加个星标&…

魅族魅蓝mirror简单打开usb调试模式的步骤

经常我们使用安卓手机链接电脑的时候&#xff0c;或者使用的有些应用比如我们企业营销团队经常使用的应用引号精灵&#xff0c;以前使用的老版本就需要开启USB调试模式下使用&#xff0c;现经常新版本不需要了&#xff0c;如果手机没有开启USB调试模式&#xff0c;电脑则无办法…

hp-ux 单用户 启动_UX备忘单:搜索与浏览

hp-ux 单用户 启动重点 (Top highlight)When designing search results and interest sites, you have to keep in mind what ‘mode’ your user is in. Are they in ‘searching mode’ or ‘browsing mode’? This will help you determine how to design your platform to…

细数开源历史上的九个重大事件

开放源码&#xff08;开源&#xff09;的精神在于使用者可以使用、复制、散布、研究和改进软件。这可以追溯到20世纪60年代&#xff0c;至今已有半个世纪了。伯乐在线-职场博客的这篇文章将列举开源历史上的九大重要事件。虽然本文不是专门对开源产品&#xff0c;但还是说到了一…