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.rhkb.cn/news/297431.html

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

相关文章

【C++ STL迭代器】iterator

文章目录 【 1. 迭代器的属性 】【 2. 不同容器支持的迭代器 】【 3. 迭代器的定义方式 】【 4. 实例 】4.1 定义方式&#xff1a;正向迭代器和反向迭代器4.2 迭代器属性&#xff1a;前向迭代、双向迭代、随机迭代4.2 迭代器的遍历方法4.3 auto关键字 自动指定迭代器定义类型 背…

GitHub git push超过100MB大文件失败(write error: Broken pipe)完美解决

问题 在使用git push推送大文件&#xff08;超过了100MB&#xff09;到GitHub远程仓库时提示异常&#xff0c;异常信息如下&#xff1a; fatal: sha1 file <stdout> write error: Broken pipe fatal: the remote end hung up unexpectedly 通过查阅了一些资料&#xff0c…

vscode开发ESP32问题记录

vscode 开发ESP32问题记录 1. 解决vscode中的波浪线警告 1. 解决vscode中的波浪线警告 参考链接&#xff1a;https://blog.csdn.net/fucingman/article/details/134404485 首先可以通过vscode 中的IDF插件生成模板工程&#xff0c;这样会自动创建.vscode文件夹中的一些json配…

【简单讲解下Tauri】

&#x1f308;个人主页:程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

深入解析:链游、DApp、公链、NFT与交易所开发的全景图

随着数字货币和区块链技术的迅速发展&#xff0c;链游开发、DApp开发、公链开发、NFT开发以及交易所开发等领域吸引了越来越多的关注。本文将以3000字的篇幅&#xff0c;对这些领域进行详细解析&#xff0c;探讨它们的意义、应用场景以及未来发展趋势。 链游开发&#xff08;Bl…

k8s部署微服务例子

一、部署服务 需要部署minio、nacos、mysql、consul、elasticsearch、视频解析服务、nfs、skywalking-oap及ui。 二、三个微服务程序 minio服务解析视频-》上传到minio进行存储&#xff0c;构造领域对象信息保存到hive&#xff08;hive on spark&#xff09;异步处理-》元数据…

论文阅读:Walk These Ways: 通过行为多样性调整机器人控制以实现泛化

Walk These Ways: 通过行为多样性调整机器人控制以实现泛化 摘要&#xff1a; 通过学习得到的运动策略可以迅速适应与训练期间经历的类似环境&#xff0c;但在面对分布外测试环境失败时缺乏快速调整的机制。这就需要一个缓慢且迭代的奖励和环境重新设计周期来在新任务上达成良…

(三)LTspice学习交流分析

文章目录 前言一、Edit simulation cmd二、添加激励总结 前言 上一节我们学习了LTspice的安装&#xff0c;很简单&#xff0c;无脑安装 &#xff08;一&#xff09;LTspice简介 &#xff08;二&#xff09;LTspice学习之简介2 今天我们来学习一下LTspice另一个非常重要的仿真功…

动态多目标优化:进化动态约束多目标优化测试集DCP1-DCP9的TruePF(提供MATLAB代码)

一、Evolutionary Dynamic Constrained Multiobjective Optimization Test Suite 以最小化为例,带约束的动态多目标优化问题&#xff08;Evolutionary Dynamic Constrained Multiobjective Optimization &#xff09;的数学描述如下: min ⁡ x ∈ S ( t ) ⊂ R n f ( x , t ) …

微信小程序python+uniapp高校图书馆图书借阅管理系统ljr9i

根据日常实际需要&#xff0c;一方面需要在系统中实现基础信息的管理&#xff0c;同时还需要结合实际情况的需要&#xff0c;提供图书信息管理功能&#xff0c;方便图书管理工作的展开&#xff0c;综合考虑&#xff0c;本套系统应该满足如下要求&#xff1a; 首先&#xff0c;在…

【医学影像数据处理】nii 数据格式文件操作汇总

大部分医学领域数据存储的都是dicom格式&#xff0c;但是对于CT等一类的序号图像&#xff0c;就需要多个dicom文件独立存储&#xff0c;最终构成一个序列series&#xff0c;这样存储就太过于复杂了。 nifti&#xff08;Neuroimaging Informatics Technology Initiative&#x…

专有钉钉微应用埋点以及本地调试埋点总结

最近在对接浙政钉&#xff0c;稳定性监控、通用采集 SDK、基础埋点、基础埋点&#xff0c;每次发布上去&#xff0c;工作人员那边反馈抓取不到信息 稳定性监控代码、通用采集 SDK index.html <!-- 流量稳定监控 S 关于埋点上线打开--><script src"https://wpk-…

通讯录的实现(顺序表应用)

上一篇文章我们讲过顺序表的实现&#xff0c;通讯录与顺序表唯一的区别就是修改了变量&#xff0c;将原来的int类型数组修改为结构体数组&#xff0c;再加写扫雷时用到的方法&#xff0c;我们就可以创建这样一个通讯录。 我们还是按照函数声明&#xff0c;函数实现与编写本体的…

基于隐私保护的可追踪可撤销密文策略属性加密方案论文阅读

论文是2022年发表的A Traceable and Revocable Ciphertext-Policy Attribute-based Encryption Scheme Based on Privacy Protection 摘要 本篇论文提出了一种具有用户撤销、白盒追踪、策略策略隐藏功能的CP-ABE方案。在该方案中密文被分为两个部分&#xff1a;第一个部分是和…

Whisper对于中文语音识别与转写中文文本优化的实践(Python3.10)

原文&#xff1a;Whisper对于中文语音识别与转写中文文本优化的实践(Python3.10) - 知乎 阿里的FunAsr对Whisper中文领域的转写能力造成了一定的挑战&#xff0c;但实际上&#xff0c;Whisper的使用者完全可以针对中文的语音做一些优化的措施&#xff0c;换句话说&#xff0c;…

股票价格预测 | Python使用BP神经网络和LSTM神经网络预测股票价格

文章目录 效果一览文章概述代码设计BP神经网络LSTM神经网络效果一览 文章概述 BP神经网络使用

算法沉淀——动态规划篇(子数组系列问题(下))

算法沉淀——动态规划篇&#xff08;子数组系列问题&#xff08;下&#xff09;&#xff09; 前言一、等差数列划分二、最长湍流子数组三、单词拆分四、环绕字符串中唯一的子字符串 前言 几乎所有的动态规划问题大致可分为以下5个步骤&#xff0c;后续所有问题分析都将基于此 …

Jenkins首次安装选择推荐插件时出现”No such plugin cloudbees-folder”解决方案

安装Jenkins成功之后&#xff0c;首次启动Jenkins后台管理&#xff0c;进入到安装插件的步骤&#xff0c;选择"推荐安装"&#xff0c;继续下一步的时候出现错误提示&#xff1a; 出现一个错误 安装过程中出现一个错误&#xff1a;No such plugin&#xff1a;cloudb…

Linux的开发工具(二):编译器gcc/g++与Linux项目自动化构建工具-Makefile

目录 Linux的编译器-gcc/g 问题一&#xff1a;gcc有时候为什么不能编译带有for循环的c语言源文件&#xff1f; 问题二&#xff1a;gcc中c源文件的后缀是什么&#xff1f; 问题三&#xff1a;gcc能编译c的源文件文件吗&#xff1f; 问题四&#xff1a;如何查看自己是否拥有…

jmeter链路压测

比如登录后返回token&#xff0c;业务打印上传的操作需要用到token 线程组中添加登录请求&#xff0c;并执行 1、添加登录并执行&#xff0c;查看结果 2、结果树中下拉选择正则表达式&#xff0c;将token参数和值复制粘贴到下方&#xff0c;将token值改为(.*?)&#xff0…