JVM剖析

0.前言

Java 是当今世界使用最广泛的技术平台之一。使用 Java 或 JVM 的一些技术包括:

  • Apache spark用于大数据处理,数据分析在JVM上运行;
  • 用于数据流的Apache NiFi在内部使用的也是 JVM;
  • 现代 Web 和移动应用程序开发中使用的React native使用 的也包含JVM 和 java 线程。

1.虚拟化

JVM 基于虚拟化技术(应用程序级虚拟化),它基本上是裸机硬件之上的抽象层。
传统计算机
虚拟化后的计算机
JVM 是应用程序级虚拟化的一个例子,它基本上是主机操作系统上的一个额外层。我们可以在操作系统内的沙箱中编译和运行 Java 程序,而不是直接使用操作系统例程。

2.代码编译与字节码

Java 代码在执行前要经过一系列转换。第一个编译过程从 java 编译器或javac开始,javac 将 java 代码转换为中间字节码,可以使用javap 等反汇编工具读取,字节码独立于计算机的平台架构,这是 java 编程语言具有可移植性的根本原因。

3.Java类结构

以下是使用 javap 反汇编后类文件的组成部分。

组成部分说明
魔数(Magic Number)0xCAFEBABE
类文件的版本(Magic Number)类文件的次要和主要版本
常量池(Constang Pool)类的常量池
访问标记(Access Flags)例如类是否为抽象、静态等等
当前类(This Class)当前类的名称
超类(Super Class)超类的名称
接口(Inrerfaces)类中所有的接口
方法(Methods)类中所有的方法

每个类文件都以一个魔法数字开头,用于确认给定文件是类文件,接下来是类格式的版本,用于检查 JVM 版本与用于编译类文件的版本的兼容性。如果存在任何不匹配,则会抛出UnsupportedClassVersionError 。

其他组件用于存储类中使用的常量,访问标志存储访问说明符(公共、私有、抽象等)。类似地,其他组件存储类中使用的超类名称、接口和方法。

public class HelloWorld { public static void main(String[] args) { for (int i = 0; i < 10; i++) {System.out.println("Hello World");} }
}

反汇编上面的 hello world 程序,结果如下是运行 hello world 程序,结果如下:

Classfile /home/xxxxxxxx/Documents/learning/java/jvm/HelloWorld.classLast modified 7 Oct 2021; size 478 bytesSHA-256 checksum 93080c0483aa97ce4c226f31f22ed95c633e0da00b997fe229bfa676f6fb53c0Compiled from "HelloWorld.java"
public class HelloWorldminor version: 0major version: 52flags: (0x0021) ACC_PUBLIC, ACC_SUPERthis_class: #5                          // HelloWorldsuper_class: #6                         // java/lang/Objectinterfaces: 0, fields: 0, methods: 2, attributes: 1

相应的机器语言指令将会是:

0: iconst_0
1: istore_1
2: iload_1
3: bipush        10
5: if_icmpge     22
8: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
11: ldc           #3                  // String Hello World
13: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
16: iinc          1, 1
19: goto          2
22: return

源码解读:将常量存储到JVM堆栈中加载并与10进行比较,如果数字大于或等于10,则停止并退出函数,否则打印“ Hello world ”,直到满足条件。

4.解释和类加载

JVM类加载
将给定的源代码转换为字节后,JVM 将开始逐行解释类文件。JVM 是基于堆栈的解释器机器,因此 JVM 将使用内部堆栈来存储执行结果,而不是使用CPU 寄存器。此过程从将执行所需的所有类加载到方法缓存中开始。

4.1.类加载

代码执行中的三个重要过程:

  • 加载:加载执行所需的所有类。

  • 链接:验证类文件并解析所有符号引用。

  • 初始化:初始化程序中定义的所有静态变量。

4.1.1.类加载器的类型

  • 启动类加载器: Bootstrap 类加载器将加载源代码中的所有核心类,包括包含 main 函数的类。

  • 扩展类加载器:扩展类加载器以引导类作为其父类加载器。如果核心 Java 类中的任何方法被重写,则扩展类加载器将加载该类而不是原始类。

  • 应用程序类加载器:加载类路径中找到的所有类。如果类路径中未找到某个类,则会抛出classnotfound异常。

5.热点编译

C++ 实现遵循零开销原则:您不用的东西就不用付费。而且,您用的东西,您编写的代码再好不过了。Bjarne Stroustrup

ava 是一种蓝领语言。它不是博士论文材料,而是一种工作语言。James Gosling

热点编译是一种使 Java 代码执行速度比 C 和 C++ 等语言更快、更高效的方法。热点编译是一种方法,在解释过程进行时,分析器将开始收集有关执行的信息,基于此信息,即时 ( JIT)编译器将应用一组优化。

6.Java内存分配及内存管理

JVM 中运行的所有线程都会有一个公共堆,运行程序所需的所有内存都会从这个堆中分配,如果所需内存大于当前 JVM 堆内存,则会引发内存超出范围的异常。默认情况下,对象是可变的,除非它们由 final 关键字定义。

一个线程创建的任何对象都可以被另一个线程访问,可以通过一种称为互斥锁或互斥锁的技术来避免异常情况(一个线程引用的内存被另一个线程改变)。

7.JIT编译

此过程也称为配置文件引导优化。配置文件将跟踪当前正在运行的子系统的信息,当值达到某个阈值时将应用一组优化。一些配置文件引导优化策略如下:

  • 基于计数器的优化: Profiler 将保留方法调用次数的计数。如果计数达到大于某个阈值的值,则将缓存该方法,下次无需再次解释该方法,而是直接从缓存中获取该值;
  • 堆栈上替换:缓存不经常使用但包含循环的方法;
  • 内联:例如,用更高效的代码替换的过程。

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

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

相关文章

HTTPS RSA 握手解析(计算机网络)

传统的 TLS 握手基本都是使用 RSA 算法来实现密钥交换的&#xff0c;在将 TLS 证书部署服务端时&#xff0c;证书文件其实就是服务端的公钥&#xff0c;会在 TLS 握手阶段传递给客户端&#xff0c;而服务端的私钥则一直留在服务端。 在 RSA 密钥协商算法中&#xff0c;客户端会…

佳能打印机E568扫描书和文件方法

官方网站; Canon : Inkjet 手册 : IJ Scan Utility : 启动IJ Scan Utility 打开打印机电源 扫描一个文件&#xff0c;翻页后盖好盖子。再点击扫描。 所有扫描结束之后点退出 点击保存

【无限列车1】SpringCloudAlibaba 与 SpringBoot后端架构的搭建

【无限列车1】SpringCloudAlibaba 与 SpringBoot后端架构的搭建 1、版本说明二、日志相关配置3、AOP 打印日志4、下载开源前端后台管理系统5、添加网关模块6、集成数据库和mp(1) 添加驱动和mp依赖(2) 数据库配置(3) 使用MybatisPlus 7、加密 yaml 文件中的内容(1) 依赖(2) 敏感…

02---webpack基础用法

01 entry打包的入口文件&#xff1a; 单入口entry是一个字符串:适用于单页面项目module.exports {entry:./src/index.js}多入口entry是一个对象module.exports {entry:{index:./src/index.js,app:./src/app.js}} 02 output打包的出口文件&#xff1a; 单入口配置module.ex…

基于SSM的网络视频播放器

目录 背景 技术简介 系统简介 界面预览 背景 互联网的迅猛发展彻底转变了全球各类组织的管理策略。自20世纪90年代起&#xff0c;中国政府和企业便开始探索利用网络系统进行信息管理。然而&#xff0c;早期的网络覆盖不广泛、用户接受度不高、相关法律法规不完善以及技术开…

C#实现只保存2天的日志文件

文章目录 业务需求代码运行效果 欢迎讨论&#xff01; 业务需求 在生产环境中&#xff0c;控制台窗口不便展示出来。 为了在生产环境中&#xff0c;完整记录控制台应用的输出&#xff0c;选择将其输出到文件中。 但是&#xff0c;存储所有输出的话会占用很多空间&#xff0c;…

uniApp使用uview对vuex的二次封装实现全局变量

1、uni-app目根目录新建’/store/index.js’&#xff0c;并复制如下内容到其中 2、uni-app目根目录新建’/store/ u . m i x i n . j s ′ &#xff0c;并复制如下内容到其中&#xff0c;由于 H X 某些版本的限制&#xff0c;我们无法帮您自动引入 " u.mixin.js&#xff0…

element-ui card 组件源码分享

今日简单分享 card 组件源码&#xff0c;主要从以下两个方面&#xff1a; 一、card 组件页面结构 二、card 组件属性 2.1 header 属性&#xff0c;设置 header&#xff0c;也可以通过 slot#header 传入 DOM&#xff0c;类型 string&#xff0c;无默认值。 组件使用部分&#…

Linux TUN设备实现Tunnel性能分析

一、TUN/TAP设备原理&#xff1a; Linux的TUN/TAP设备是一种可以使得应用层与TCP/IP协议栈交互的驱动模块&#xff0c;通常用于组建虚拟局域网中的点对点隧道&#xff08;Tunnel&#xff09;&#xff0c;可以工作于2层&#xff08;TAP设备&#xff09;和3层&#xff08;TUN设备…

Linux的软链接和硬链接

1、软链接 概念&#xff1a;给文件创建一个快捷方式&#xff0c;依赖原文件&#xff0c;和普通文件没有区别。 特性&#xff1a; 可以给存在的文件或目录创建软链接可以给不存在的文件或目录创建软链接可以跨文件系统创建软链接删除软链接不影响原文件、删除原文件会导致软链…

moment.js 产出未知格式的时间,可能的原因

moment.js 产出未知格式的时间&#xff0c;可能的原因 有个问题困扰我好久了&#xff0c;在项目中使用格式化时间的时候会产出一些千奇百怪的格式&#xff0c;产出的文字我都不认识。 百思不得其解&#xff0c;终于今天在看代码的时候发现了这个问题。 它的表现是这样的&…

算法之模拟

前言 模拟算法通俗地来解释就是 "照葫芦画瓢", 通常这类题的题目中就说明了这道题应该怎么做, 要做的就是把题目的意思转化为代码, 这类题的特点是思路比较简单, 考查的是代码能力. 1. 模拟算法流程, 最好在演草纸上过一遍流程, 凭空想象可能会忽略一些细节 2. 把流…

软件架构复用

1.软件架构复用的定义及分类 软件产品线是指一组软件密集型系统&#xff0c;它们共享一个公共的、可管理的特性集&#xff0c;满足某个特定市场或任务的具体需要&#xff0c;是以规定的方式用公共的核心资产集成开发出来的。即围绕核心资产库进行管理、复用、集成新的系统。核心…

比较靠谱的测试进度报告

在测试的过程中&#xff0c;不要等领导过问&#xff0c;有一份比较靠谱的测试进度报告&#xff0c;让关心和支持项目的干系人心里有谱&#xff0c;有利于管理层对项目的监控和资源的支持&#xff0c;有利于项目团队成员之间沟通协调&#xff0c;及时发现问题利于项目风险控制等…

OpenHarmony实战:CMake方式组织编译的库移植

以double-conversion库为例&#xff0c;其移植过程如下文所示。 源码获取 从仓库获取double-conversion源码&#xff0c;其目录结构如下表&#xff1a; 表1 源码目录结构 名称描述double-conversion/cmake/CMake组织编译使用到的模板double-conversion/double-conversion/源…

【漏洞复现】某科技X2Modbus网关多个漏洞

漏洞描述 最近某科技X2Modbus网关出了一个GetUser的信息泄露的漏洞,但是经过审计发现该系统80%以上的接口均是未授权的,没有添加相应的鉴权机制,以下列举多个未授权接口以及获取相关敏感信息的接口。 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律…

【C++11】异常机制

文章目录 一. 什么是异常&#xff1f;二. 为什么要引入抛异常机制&#xff1f;方法一&#xff1a;直接终止程序方法二&#xff1a;返回错误码方法三&#xff1a;C 标准库中的 setjmp 和 longjmp 组合总结 C 中处理异常的方式 三. 如何进行抛异常&#xff1f;1. 关于抛出的异常对…

[QOpenGLWidget+QMouseEvent]实时绘制长方形

复现moho-打卡第1天 - 20240402 1.1--QOpenGLWidget中显示长方形 实现方法&#xff1a;顶点着色器中给定长方形的四个顶点数据&#xff0c;代码如下&#xff1a; // 顶点位置 GLfloat vertics[1][4][3] { {{mousePressPosX,mousePressPosY,0.0},{mousePressPosX,mouseMoveP…

网络爬虫:爬取假数据

网络爬虫&#xff1a;爬取假数据 文章目录 网络爬虫&#xff1a;爬取假数据前言一、项目介绍&#xff1a;二、项目来源&#xff1a;三、架构图&#xff1a;&#xff08;流程图&#xff09;四、使用了什么技术&#xff1a;&#xff08;知识点&#xff09;五、结果示意图&#xf…

Qt使用opencv,进行视频录制,功能打开、关闭摄像头,开始、结束录制视频,暂停、继续录制,并保存视频文件

1.效果图 2 代码实现 2.1 .h文件 #ifndef VIDEORECORDWIDGET_H #define VIDEORECORDWIDGET_H#include <QWidget>#include<QFileDialog>#include <QImage> #include <QLabel> #include <QTimer> #include <opencv2/opencv.hpp>using name…