Java的运行原理
在Java中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟的机器。这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口。编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转换为特定系统的机器码执行。在Java中,这种供虚拟机理解的代码叫做字节码(ByteCode)(class文件的内容),它不面向任何特定的处理器,只面向虚拟机。每一种平台的解释器是不同的,但是实现的虚拟机是相同的。Java源程序经过编译器编译后变成字节码,字节码由虚拟机解释执行,虚拟机将每一条要执行的字节码送给解释器,解释器将其翻译成特定机器上的机器码,然后在特定的机器上运行。
跨平台:
话说,在北京,一般都是讲北京话的,上海,一般都是将上海话,广东,广东话…
现有一公文发出,要全国执行,该当如何?——先统一翻译成普通话。各地在将普通话版本翻译成当地的方言。
这里,北京、上海就是不同类型的机器windows,linux…
编译(javac)就是将公文翻译成普通话的过程,而编译出的.class文件,就是公文的普通话版本。
在执行的时候,各地的翻译就是jvm,负责将.class转换成本地能够理解的方言来执行。
.java→.class→机器码
java编译器 (编译) → 虚拟机(解释执行) → 解释器(翻译) → 机器码
Java虚拟机(JVM)
Java虚拟机(JVM)是Java Virtual Machine的缩写,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能模拟来实现的。
Java中,类加载器把一个类装入JAVA虚拟机需要经过三个步骤来完成:装载、链接、初始化,其中链接又分来校验、准备、解析过程
装载:查找和导入.class文件
链接:检查装入.class文件的正确性,然后,java虚拟机为变量分配内存,设置默认值
初始化:把符号引用变成直接引用。。。
复制代码
1 public class Main {
2
3 private static int size=1;
4
5 public static void main(String args[]) {
6
7 User u = new User();
8
9 u.setName(“李文水”);
10
11 u.setPwd(“159”);
12
13 String name = u.getName();
14
15 String pwd = u.getPwd();
16
17 u = null;
18
19 }
20
21 }
22
23 public class User {
24
25 private String name;
26
27 private String pwd;
28
29 public String getName() {
30
31 return name;
32
33 }
34
35 public void setName(String name) {
36
37 this.name = name;
38
39 }
40
41 public String getPwd() {
42
43 return pwd;
44
45 }
46
47 public void setPwd(String pwd) {
48
49 this.pwd = pwd;
50
51 }
52
53 }
复制代码
现在假设这两个java源文件已经被编译成了CLASS文件了,我们来看看java虚拟机怎么执行的。
Java虚拟机工作流程:
1.装载
描叙:Java虚拟机装载指定的CLASS文件
结果:形成这个CLASS类的实例对象
过程:java虚拟机使用类装载器定位到相应的CLASS文件,然后读取这个CLASS文件(一个线性二进制数据流),将它传入java虚拟机中。紧接着虚拟机提取其中的类型信息。比如:该类的类名,方法名,变量名,修饰符,方法的返回类型等等。还有一个重要的东西就是常量池。(常量池保存了该类型的所有常量,包括直接常量和对其他类型,字段,方法的符号引用)将这些信息保存在一个叫做方法区的地方。最终形成CLASS类的实例,这个实例存放在内存的堆区。它成为了java程序与内部数据结构之间的接口,程序要访问该类型的信息,程序就调用该类型对应的CLASS实例对象的方法。简而言之:这个过程就是把一个类型的二进制数据解析为方法区中的内部数据结构,并在堆上建立一个CLASS对象的过程。
示例:装载Main类
Java虚拟机读取Main类的CLASS文件,生产对应的java.lang.Class类的实例,读取其中的类型信息,比如修饰符 private,public,static,另外变量 size,name,pwd,User(User即为一个引用)共同构成了这个类的常量池。将这些信息保存在方法区,
2.链接
描述:验证,准备,解析(可选)
结果:这个类型是正确的。(这里不知道该怎么描述)
过程:
1)验证:确定类型符合java语言的语义,比如:final类不能有子类,final方法不能被覆盖,确保在类型和超类型之间没有不兼容的方法声明(比如两个方法拥有同样的名字,参数完全相同,但返回类型不同)。
2)准备:java虚拟机为类变量分配内存,设置默认值
3)解析:在类型的常量池中寻找类,接口,字段和方法的符合引用把这些符号引用替换成直接引用的过程。
示例: 连接Main类
Java虚拟机为size分配内存,并赋默认值0.找到常量池中User类的引用,如果User类还没有被装载,则装载并且连接该类,然后将常量池中对User类的引用替换为直接引用。在此时User类并不会被初始化,因为还没有用它。
3.初始化
描述:初始化一些静态变量
结果:这个类型可以使用了
过程:可能会调用()方法,(这个方法只能够由java虚拟机调用)来初始化该类的静态变量。在调用这个方法前,必须确认该类的超类的() 方法已经被调用。
示例:初始化Main类
Java虚拟机将Main类的静态变量赋值为1.
4.使用(执行该类代码了)
1.User u = new User();(存放在内存的堆区)
创建了一个User类实例,实际上是通过这个类的CLASS实例实例化的。方法如下:
User u=(User)Class.forName(“User”).newInstance();
为了方便,用C代替Class.forName(“User”)
2.u.setName(“李文水”); u.setPwd(“159”);
调用该类的方法,为该类的变量赋值,Java虚拟机内部调用是这样的,通过方法区找到该方法,利用CLASS实例的如下方法调用:
c.getMethod(“setName”).invoke(u,“李文水”);
3.String name = u.getName(); String pwd = u.getPwd();
与第二步类似,不同的是将取得的值分别赋给了变量name和pwd。关键是这个值保存在哪里?和实例对象一样,存放在堆区。这个时候我应该可以看出CLASS实例的作用了,它就是起个中间作用,将程序中的调用反应到堆区上数据的变化。
4.u = null;
这个步骤写出来的目的是了解一下Java虚拟机垃圾回收机制。(没有什么实际意义)
Java虚拟机内部会根据一种规则(这个对象是否可以触及)来判断这两个类是否可以回收了?具体形式如下:
当执行 u = null;时这条线就被斩断了,因此User实例就不可以触及了,所以java虚拟机就可以回收这个User实例了
一步一个脚印,方便自己复习,欢迎大家指正,非常感谢,共同进步!
相关文章:
Java的运行原理
在Java中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟的机器。这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口。编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转换为特定…...
在已有VPC中创建EKS集群
1. 美东1 默认配置 创建在master-vcp中节点放在两上Public Subnet上,便于SSH登录维护Attach上默认安全组sg-071f18562f41b5804,打通各种常规的网络访问规则cat << EOF > master-eks-cluster.yaml apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata:name…...
Spring boot 注解@Async不生效 无效 不起作用
今天在做公司项目时,有一个发邮件的需求。所以写了一个发送邮件的方法后来发现发邮件很慢,导致接口响应也很慢。于是我便想到要使用异步调用去处理这个方法。于是我把注解Async 加到了自己service类下的一个发邮件的一个方法,后来发现并没有生…...
如何封装一个js文件?
封装js文件时的注意事项 避免全局变量污染:使用闭包或模块模式封装代码,不将变量暴露在全局作用域。 // 闭包方式 (function () {var a 1;function foo() {// ...} })();// 模块模式 var module (function () {var a 1;function foo() {// ...}return {foo: fo…...
计算卸载-论文05-双层优化(无线充电与卸载)
标题:《A Divide-and-Conquer Bilevel Optimization Algorithm for Jointly Pricing Computing Resources and Energy in Wireless Powered MEC》 期刊:IEEE TRANSACTIONS ON CYBERNETICS,2022 一、理论梳理 问题:相比于移动云…...
RSBBS 报表接口 query跳转 RRI
这里只讲RSBBS的goto query,不讲query里面的替换路径。 报表接口就是从一个query跳转到另一个目的地。从下面能看到,可以跳转到一个BW系统下的query,或者能跳转到ERP系统的一个ABAP report也行,或者可以通过archive link去从quer…...
失业五个月,终于有offer了!但这家公司的风评惨不忍睹,要接吗?
往年,程序员们找工作可以说是不怎么费力的,不少求职者还会比对几家offer,看薪酬、看加不加班、看通勤时间等等等等,最后选择自己最满意的那一家过去。 但是今年,情况确实完全不一样,用网友的话形容就是“往…...
智慧井盖监测终端,智能井盖-以科技解决智慧城市“顽疾”,守护城市生命线
平升电子智慧井盖监测终端,智能井盖-以科技解决智慧城市“顽疾”,守护城市生命线-智慧井盖,实现对井下设备和井盖状态的监测及预警,是各类智慧管网管理系统中不可或缺的重要设备,解决了井下监测环境潮湿易水淹、电力供应困难、通讯不畅等难题…...
VMware Workstation 与 Device/Credential Guard 不兼容.在禁用 Device/Credenti
这个时候我们需要去关掉几个功能 1、关闭Hyper-V 打开控制面板首页,找到“程序”,然后找到“启用或关闭Windows功能”,找到“Hyper-V”,有勾中的全部都取消掉,如果这一步操作失败,不要紧,继续…...
微信小程序开发实战课后习题解答————第四章(作业版)
一、填空题 1、 组件 是视图层的基本组成单元。 2、 swiper内部只可以放置 swiper-item 组件。 3、 设置text文本内容长按可选的属性是 selectable 。 4、navigator组件通过设置 open-type 属性,来区分不同的跳转功能。 5、通过image的 mode …...
web缓存—Squid代理服务
1.squid的相关知识 1.1 squid的概念 Squid服务器缓存频繁要求网页、媒体文件和其它加速回答时间并减少带宽堵塞的内容。 Squid代理服务器(Squid proxy server)一般和原始文件一起安装在单独服务器而不是网络服务器上。Squid通过追踪网络中的对象运用起…...
免费可用 ChatGPT 网页版
前言 ChatGPT(全名:Chat Generative Pre-trained Transformer),美国OpenAI 研发的聊天机器人程序 ,于2022年11月30日发布 。ChatGPT是人工智能技术驱动的自然语言处理工具,它能够通过理解和学习人类的语言来…...
【JVM】7. 方法区
文章目录 7. 方法区7.1. 栈、堆、方法区的交互关系7.2. 方法区的理解7.2.1. 方法区在哪里?7.2.2. 方法区的基本理解7.2.3. HotSpot中方法区的演进 7.3. 设置方法区大小与OOM7.3.1. 设置方法区内存的大小7.3.2. 如何解决这些OOM 7.4. 方法区的内部结构7.4.1. 方法区&…...
23种设计模式之代理模式(Proxy Pattern)
前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将23种设计模式中的代理模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。 如果文章有什么需要改进的地方还请大佬不…...
服务扫描与查点-渗透测试模拟环境(3)
本篇将介绍服务扫描与查点渗透模拟环境下整理的各类收集方法、各类工具技术使用的演示,阅读后可用在工作上。 很多网络服务是漏洞频发的高危对象,对网络上的特定服务进行扫描,往往能让我们少走弯路,增加渗透成功的几率。确定开放端口后,通常会对相应端口上所运行服务的信息…...
Educational Codeforces Round 148 (Rated for Div. 2) 题解
总结:5.21下午VP一场,死在了A题,给我wa崩溃了,浪费了差不多一个小时,BC还挺顺畅,虽然C题是在结束后不久交上去的。。。。 A. New Palindrome 思路:其实思路很简单,“The string s …...
Java自定义类:打造属于自己的编程世界
🧑💻CSDN主页:夏志121的主页 📋专栏地址:Java核心技术专栏 目录 一、自定义类示例 二、隐式参数与显式参数 三、封装的优点 自定义类是Java中最基本、也是最重要的组成部分之一,使用者可以根据需求创建…...
kubectl top pod输出的cpu、内存使用率是怎么计算的
使用 kk 创建 k8s 集群 文档:https://github.com/kubesphere/kubekey/blob/master/README_zh-CN.md 1、下载 kk export KKZONEcn curl -sfL https://get-kk.kubesphere.io | sh - yum -y install conntrack socat2、生成配置文件,根据环境修改配置文件…...
Spring和SpringBoot常用注解(持续更新)
持久层(pojo) 1.Data注解 lombok注解,用于自动生成getter\setter\toString等方法,使用前需要在pom.xml中引入如下内容 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifa…...
redis做异步消息处理
pom依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 发送消息: RedisTemplate.convertAndSend(String channel, Obj…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...
pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
