JVM理论(一)基础概念

news2024/11/14 20:52:55

JVM概述

 

JVM就是二进制字节码的运行环境,负责装载字节码到其内存,解释/编译为对应平台上的机器指令执行,每条java指令在java虚拟机规范中都有详细定义,包括如何取、处理操作数等;
JVM特点如下

  • 一次编译,到处运行(各CPU的架构不同的情况下JVM为了实现跨平台,字节码指令不能采用寄存器方式执行,目前都是按照栈的方式存取的;栈的特点就是指令多,指令集小,可跨平台
  • 自动内存管理
  • 自动垃圾回收功能

JVM分类

目前实现JVM规范的主流的虚拟机包括Hotspot,JRocket,J9;

Hotspot

hotspot属于Oracle产品,目前占有绝对的市场地位

  • 过去主流的jdk6以及目前主流的jdk8,以及sun/open jdk中的JVM默认都是hotspot;
  • 方法区的概念只有在hotspot中存在,在J9以及JRocket不存在;
  • 通过执行引擎中的解释器和JIT编译器(也称为后端编译器,java源代码编译为字节码文件中的编译器称为前端编译器,它们统一称为编译器)协同工作,在最优化的响应时间(主要体现在解释器)和最佳执行性能(主要通过JIT)取得平衡

JRocket

在商用领域,JRocket也是比较流行的虚拟机,它和Hotspot都属于Oracle产品,而且它尤其专注于服务器端应用领域

  • JRocket号称是世界上最快的JVM;
  • 追求的是程序最佳的执行性能,所以JRocket执行引擎中只存在JIT编译器,而没有解释器
  • JDK8中,Oracle将JRocket当中有限的特性(毕竟两者架构完全不同)整合到Hotspot中 

J9

属于IBM产品,在商用领域比较有影响力的JVM之一

  • 在IBM相关产品中使用广泛且稳定,但在其他产品一言难尽
  • 2017年,IBM发布了Open J9 产品并交由Eclipse基金会管理 

扩展

sun jdk最初是sun公司非开源产品,而openjdk属于Oracle开源的产品;虽然Sun JDK和OpenJDK是Java开发工具包(JDK)的两种不同实现,但是从功能和性能上来说,Sun JDK和OpenJDK现在基本认为是相同的;而hotspot虚拟机是openjdk默认的虚拟机

JVM生命周期

虚拟机的启动

Java虚拟机的启动是通过引导类加载器bootstrap classloader 创建一个初始类来完成的,这个类是由虚拟机的具体实现(如Hotspot,J9等)指定的

虚拟机的执行

一个运行的java虚拟机有一个虚拟机进程专门执行java程序,程序开始执行它才运行,程序结束时它就停止

虚拟机的退出

程序正常执行结束,比如我正常关闭了应用服务器
程序在执行过程中遇到异常或者错误而终止
操作系统出现错误而导致JVM虚拟机终止
程序调用了runtime或者system的exit方法,强制退出JVM
 

JVM的位置

JVM可屏蔽各操作系统间差异性

JVM体系结构(核心!!!)

JVM内存结构

JVM主要由三大部分组成,分别是类加载子系统,运行时数据区,执行引擎


类加载子系统

类加载器通过执行加载、链接(验证->准备->解析)、初始化后将字节码文件(java源代码使用编译器(javac)编译为字节码文件)加载到内存(即运行时数据区的方法区中);

运行时数据区(即JVM内存!!!)

包括堆,方法区,虚拟机栈,本地方法栈,程序计数器,JVM会将不同类型的对象分配到堆,栈,方法区中,其中:

  •         堆用于存储对象实例。在运行时,当需要创建对象时,JVM将在堆中分配内存给新对象
  •         栈用于存储局部变量和方法调用。每个线程在运行时都会有一个对应的栈帧,用于存储            方法参数、局部变量以及方法返回值等信息
  •         方法区用于存储已加载类的结构信息,包括类的字段、方法代码以及常量池等
  •         程序计数器则记录当前线程执行的字节码指令的地址

扩展

  • 方法区和堆是被所有线程共享的区域,虚拟机栈和程序计数器以及本地方法栈都是线程私有的
  • 每个线程都有独立的虚拟机栈,本地方法栈,程序计数器;
  • 只有方法区和堆才会产生GC以及OOM异常,虚拟机栈和本地方法栈仅会出现OOM,程序计数器不会出现GC以及OOM;

执行引擎

作用是将加载到内存中方法区的字节码指令解释为机器指令,然后申请CPU资源解释执行;主要由解释器,JIT即时编译器,GC组成,其中:

  •     解释器(Interpreter): 按照字节码指令逐条解释执行,可以快速启动,但执行速度相对较慢。
  •     即时编译器(Just-in-Time Compiler,JIT): 将热点代码(被频繁执行的代码)编译为本地机器       码,以提高执行速度。JIT会对统计信息进行分析,并对经常执行的代码进行动态优化。
  •     垃圾回收(Garbage Collection): JVM通过垃圾回收机制自动管理内存,并释放不再使用的对象内存空间,垃圾回收过程主要包括以下步骤:
    •     a. 标记(Marking): 标记存活的对象
    •     b. 清除(Sweeping): 清除或回收未标记的对象
    •     c. 压缩(Compacting): 对存活对象进行整理,消除内存碎片
    •     d. 分代(Generational): 根据对象的生命周期将内存分为不同的代(Generation),一般将堆分为新生代和老年代,根据对象存活时间的不同采用不同的回收算法

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

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

相关文章

删除链表的倒数第 N 个结点——力扣19

题目描述 法一)计算链表长度 class Solution { public:int getLength(ListNode* head){int len0;while(head){len;head head->next;}return len;}ListNode* removeNthFromEnd(ListNode* head, int n) {int len getLength(head);ListNode* dummy new ListNode …

汽车架构解析:python解析Autosar架构的ARXML

文章目录 前言一、Container-I-PDU概念引入二、以文本形式读取ARXML文件三、解析Frame的基本参数四、解析Frame中的PDU五、解析PDU中的Signals六、解析Signal中的初始值和长度七、解析Signal中的起始位置八、解析Signal中的枚举值或公式九、解析ARXML总结 前言 Autosar架构下a…

什么是人工智能?

人工智能基本定义: 人工智能(Artificial Intelligence),英文缩写为AI。 它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能是新一轮科技革命和产业变革的重要驱动力量。 人工…

美团面试官:可重复读隔离级别实现原理是什么?(一文搞懂MVCC机制)

本文首发于公众号【看点代码再上班】,欢迎围观,第一时间获取最新文章。 原文:美团面试官:可重复读隔离级别实现原理是什么?(一文搞懂MVCC机制) “全文共计4270字,预计阅读时间6分钟 …

MATLAB | 爱心图例与精致半透明圆角图例

本文中全部示意图均为本人自制,传播时请注明出处。 写了点小成品函数,比如如何绘制饼图时把图例上的图标变成心形: 比如如何自制半透明圆角图例: 依旧先讲原理再给出这俩代码哈: 1 原理讲解-图形对象 封闭四边形对…

3.7.使用cuda核函数加速warpaffine

目录 前言1. warpAffine2. warpAffine案例2.1 导言2.2 main函数2.3 warpaffine_to_center_align函数2.4 warp_affine_bilinear函数2.5 warp_affine_bilinear_kernel核函数2.6 AffineMatrix结构体 3. 补充知识总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0…

【滨小之旅搜索】八皇后

题目传送门 [USACO1.5] 八皇后 Checker Challenge 题目描述 一个如下的 6 6 6 \times 6 66 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有…

js中判断一个对象是否存在

一、Boolean()方法 用Boolean()方法可以将Js中的任意数据类型转为布尔值: 二、用于判断xx是否存在 js一般会自动执行Boolean()方法,我们可以借此判断某个对象在js当前的执行环境中知否存在。如: var x 1; // x的数据类型为数值 if (x) { …

Microsoft 宣布今年底关闭开源软件托管平台 CodePlex

Microsoft 宣布,将关闭开源软件托管平台 CodePlex。Microsoft 2006 年推出这项服务,并决定在今年 12 月 15 日将其关闭。 Microsoft 公司副总裁 Brian Harry 在网上博客中写道,人们将可以下载他们的数据档案,Microsoft 正与面向开…

Vue3 动态路由、动态组件使用示例

前期回顾 Vue3 TS Vite —— 大屏可视化 项目实战_vue3可视化大屏_彩色之外的博客-CSDN博客大屏可视化项目实战_vue3可视化大屏https://blog.csdn.net/m0_57904695/article/details/131014666?spm1001.2014.3001.5501 目录 👍 动态组件 👀 动态路由…

链接做网络互动酷投票平台网络投票

关于微信投票,我们现在用的最多的就是小程序投票,今天的网络投票,在这里会教大家如何用“活动星投票”小程序来进行投票。 我们现在要以“读好书助成长”为主题进行一次投票活动,我们可以在在微信小程序搜索,“活动星投…

3.9.错误处理的理解以及错误的传播特性

目录 前言1. thrust2. error总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程,之前有看过一遍,但是没有做笔记,很多东西也忘了。这次重新撸一遍,顺便记记笔记。 本次课程学习精简 CUDA 教程-错误处理的理解以及错误的传播…

机械臂与RealSense相机手眼标定

环境: 本文主要使用kinova mico机械臂 RealSense D435i深度相机进行了eye to hand的手眼标定。 系统环境:Ubuntu18.04,ROS Melodic 硬件:Kinova mico,RealSense D435i 特别注意:经测试,本方法…

大人,时代变了!做测试也要懂Python开发!(文末送书五本)

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

一道有趣的C语言指针笔试题

一道有趣的指针笔试题 注:博主认为,如果想要做对并理解这一题的有关知识点,读者有必要对指针有一个较为全面且深刻的认识,如果小伙伴们对指针还不是太熟悉,建议先看看一篇带你玩转C语言指针:从入门到精通 …

OpenCV 入门教程:自适应阈值处理

OpenCV 入门教程:自适应阈值处理 导语一、自适应阈值处理二、示例应用2.1 图像二值化2.2 图像去噪 总结 导语 自适应阈值处理是图像处理中常用的技术之一,它能够根据图像的局部特征自动调整阈值,从而提高图像的处理效果。在 OpenCV 中&#…

手把手教你云相册项目简易开发 day1 Kafka+IDEA+Springboot+Redis+MySQL+libvips 简单运行和使用

项目的创建 项目采用的是微服务的架构。先创建一个父项目cloud-photo,然后再在module下创建api、image、users的子项目 相关配置: application.yml。此处如果没有redis的话可以先注释掉,因为后面启动需要mysql连接成功和redis服务启动 spr…

多元分类预测 | Matlab 麻雀算法(SSA)优化xgboost的分类预测,多特征输入模型,SSA-xgboost分类预测模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元分类预测 | Matlab 麻雀算法(SSA)优化xgboost的分类预测,多特征输入模型,SSA-xgboost分类预测模型 多特征输入单输出的二分类及多分类模型。程序

文心一言 VS 讯飞星火 VS chatgpt (56)-- 算法导论6.3 2题

文心一言 VS 讯飞星火 VS chatgpt (56)-- 算法导论6.3 2题 对于 BUILD-MAX-HEAP 中第 2行的循环控制变量 i 来说,为什么我们要求它是从A.length/2到1递减,而不是从1到A.length/2递增呢? 文心一言: 在 BUILD-MAX-HE…

MySQL每日一练:单表查询

一、首先需要创建一个名为worker的表: mysql> create table worker(-> part_id int(11) not null comment 部门号,-> work_id int(11) not null comment 职工号,-> work_time date not null comment 工作时间,-> salary float(8,2) not null commen…