JVM原理

news/2024/4/26 21:15:42/文章来源:https://blog.csdn.net/kukudeYSB/article/details/130331304

JVM

什么是JVM?

  • JVM是一种虚拟出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

  • JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java语言最重要的特点就是跨平台运行。

  • 使用JVM就是为了支持与操作系统无关,实现跨平台。

JRE

Java平台,所有java程序都要在JRE环境下才能开发

JDK

是开发者用来编程、调试程序用的开发包。JDK也是Java程序需要在JRE上运行

JVM的原理

img

Java编译器将Java代码转换成字节码文件。通过JVM将每条指令翻译成不同的机器码,通过特定平台运行

JVM内存模型

程序计数器

能够使得每个线程都在线程切换后能够恢复在切换之前的程序执行位置

是每个线程私有的,由于程序计数器中存储的数据所占空间的大小不会随程序的执行而发生改变,因此,对于程序计数器是不会发生内存溢出现象(OutOfMemory)的。

Java栈

Java栈中存放的是一个个的栈帧,每个栈帧对应一个被调用的方法,在栈帧中包括局部变量表(Local Variables)、操作数栈(Operand Stack)、指向当前方法所属的类的运行时常量池的引用(Reference to runtime constant pool)、方法返回地址(Return Address)和一些额外的附加信息

本地方法栈

本地方法栈与Java栈的作用和原理非常相似。区别只不过是Java栈是为执行Java方法服务的,而本地方法栈则是为执行本地方法(Native Method)服务的

Java中的堆是用来存储对象本身的以及数组(数组引用是存放在Java栈中的)。堆是被所有线程共享的,在JVM中只有一个堆。

方法区

与堆一样,是被线程共享的区域。在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。

在Class文件中除了类的字段、方法、接口等描述信息外,还有一项信息是常量池,用来存储编译期间生成的字面量和符号引用。

在方法区中有一个非常重要的部分就是运行时常量池,它是每一个类或接口的常量池的运行时表示形式,在类和接口被加载到JVM后,对应的运行时常量池就被创建出来。当然并非Class文件常量池中的内容才能进入运行时常量池,在运行期间也可将新的常量放入运行时常量池中,比如String的intern方法。

JVM的垃圾回收机制

不定时去堆内存中清理不可达对象

System.gc(); // 手动回收垃圾

finalize()方法

finalize()方法是在每次执行GC操作之前时会调用的方法,可以用它做必要的清理工作。

如何判断对象是否存活

应用计数法(主流虚拟机没有使用)

—引用计数法就是如果一个对象没有被任何引用指向,则可视之为垃圾。这种方法的缺点就是不能检测到环的存在。

概念: 每个对象在创建的时候,就给这个对象绑定一个计数器。每当有一个引用指向该对象时,计数器加一;每当有一个指向它的引用被删除时,计数器减一。这样,当没有引用指向该对象时,计数器为0就代表该对象死亡

优点: 引用计数算法的实现简单,判定效率也很高,在大部分情况下它都是一个不错的算法

缺点: 主流的Java虚拟机里面没有选用引用计数算法来管理内存,其中最主要的原因是它很难解决对象之间相互循环引用的问题

可达性分析法

—该种方法是从GC Roots开始向下搜索,搜索所走过的路径为引用链。当一个对象到GC Roots没用任何引用链时,则证明此对象是不可用的,表示可以回收

可以作为GC Roots 的对象:

  1. 虚拟机栈(栈帧中的本地变量表)中引用的对象;
  2. 方法区中类静态属于引用的对象;
  3. 方法区中常量引用的对象;
  4. 本地方法栈中JNI(即一般说的Native方法)引用的对象。

优点:

  • 解决相互循环引用问题。

缺点:

  • 目前和引用计数法比没得缺点

垃圾回收机制策略

引用技术算法

概念:

每个对象在创建的时候,就给这个对象绑定一个计数器。每当有一个引用指向该对象时,计数器加一;每当有一个指向它的引用被删除时,计数器减一。这样,当没有引用指向该对象时,计数器为0就代表该对象死亡,这时就应该对这个对象进行垃圾回收操作。

优点:

  • 实现简单,判定效率也很高

缺点:

  • 主流的Java虚拟机里面没有选用引用计数算法来管理内存,其中最主要的原因是它很难解决对象之间相互循环引用的问题。

标记–清除算法

概念:

为每个对象存储一个标记位,记录对象的状态(活着或是死亡)。
分为两个阶段,一个是标记阶段,这个阶段内,为每个对象更新标记位,检查对象是否死亡;第二个阶段是清除阶段,该阶段对死亡的对象进行清除,执行 GC 操作。

优点:

  • 可以解决循环引起的问题
  • 必要时才回收(没有内存时)

缺点:

  • 回收时,应用需要挂起
  • 标记和清除的效率不高,尤其是要扫描的对象比较多的时候
  • 会造成内存碎片(会导致明明有内存空间,但是由于不连续,申请稍微大一些的对象无法做到)

标记–整理算法

概念:

标记清除算法和标记压缩算法非常相同,但是标记压缩算法在标记清除算法之上解决内存碎片化(有些人叫"标记整理算法"为"标记压缩算法")

标记-整理法是标记-清除法的一个改进版。同样,在标记阶段,该算法也将所有对象标记为存活和死亡两种状态;不同的是,在第二个阶段,该算法并没有直接对死亡的对象进行清理,而是将所有存活的对象整理一下,放到另一处空间,然后把剩下的所有对象全部清除。这样就达到了标记-整理的目的。
优点:

  • 解决标记清除算法出现的内存碎片问题

缺点:

  • 压缩阶段,由于移动了可用对象,需要去更新引用

复制算法

概念:

该算法将内存平均分成两部分,然后每次只使用其中的一部分,当这部分内存满的时候,将内存中所有存活的对象复制到另一个内存中,然后将之前的内存清空,只使用这部分内存,循环下去。

这个算法与标记-整理算法的区别在于,该算法不是在同一个区域复制,而是将所有存活的对象复制到另一个区域内。

优点:

  • 在存活对象不多的情况下,性能高,能解决内存碎片和java垃圾回收算法标记-清除算法 中导致的引用更新问题

缺点:

  • 会造成一部分的内存浪费。不过可以根据实际情况,将内存块大小比例适当调整;如果存活对象的数量比较大,复制算法的性能会变得很差。

查考博客:http://t.csdn.cn/E58t6

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

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

相关文章

智慧管廊监控与报警管控一体化系统解决方案

摘要:智慧管廊监控与报警管控是一项综合性质较高的管控操作系统。在各项系统结构之间因为技术管理体系之间的差异,所评价的标准也有着不同的区分,导致各项标准之间难以实现相互之间的联通。这种形式下就需要实现环境与设备之间的监控管理、通…

(IPC)进程间通信的常用的两种方式——管道、共享内存

前言: 众所周知,不同的进程之间,在正常情况下,由于其拥有独立的PCB、上下文等原因,每个进程都是独立且互不干扰,这不仅保证了进程的安全,也降低了OS对于进程的管理成本。 但是通常情况下&…

01-yolo算法

要点: 归纳 YOLOv5 github 1 YOLO v1 1) 将一幅图像分成SxS个网格(grid cell),如果某个object的中心 落在这个网格中,则这个网格就负责预测这个object。 2)每个网格要预测B个bounding box,每个bounding box 除了要预测位置之…

倾斜摄影三维模型、激光点云、正射影像、数字高程模型如何实现在线浏览?

四维轻云是成都远石技术团队基于浏览器打造的一款地理空间数据管理云平台,可实现TB级大规模倾斜摄影三维模型发布管理,并支持私有化部署和高阶功能定制化开发。 1、注册登录 首先在四维轻云官网点击「立即试用」按钮,进入登录页面并点击「注…

C# 特性(Attribute)

一、特性(Attribute)定义 特性(Attribute)是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。您可以通过使用特性向程序添加声明性信息。 特性使用中括号…

2023年制造业产品经理考NPDP有什么用?

产品经理国际资格认证NPDP是新产品开发方面的认证,集理论、方法与实践为一体的全方位的知识体系,为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会(PDMA)成立于1979年,是…

键盘录入及标识符

键盘录入 键盘录入介绍: ●为什么要有键盘录入? 目的:为了让我们操作的数据,变得更加灵活 举例:int a10; 这里a虽然是个变量,但记录的值,却是手动写死的。 提问:能不能让a变量记录的值,灵活…

electron编译环境搭建和第一个桌面应用例子

前言 Electron是基于Chromium和Node.js实现的,所以开发人员所需要使用到的前端技术主要包括以下方面: 1、Html、CSS、JavaScript、ES6 2、前端开发工具Vue、Angular、React等的一种 3、其他网络、缓存、通讯、系统、跟踪等前端技术 4、对Vscode编辑…

JUC高级十二-ReentrantLock、ReentrantReadWriteLock、StampedLock

无锁→独占锁→读写锁→邮戳锁 1. 关于锁的大厂面试题 你知道Java里面有哪些锁?你说你用过读写锁,锁饥饿问题是什么?有没有比读写锁更快的锁?StampedLock知道吗?(邮戳锁/票据锁)ReentrantReadWriteLock有锁降级机制策略你知道吗&#xff1…

总结827

学习目标: 4月(复习完高数18讲内容,背诵21篇短文,熟词僻义300词基础词) 学习内容: 高等数学:刷1800,做了26道计算题,记录两道错题,搞懂了,但并不…

家庭智能开关通断—Homekit智能

智能通断器,也叫开关模块,可以非常方便地接入家中原有开关、插座、灯具、电器的线路中,通过手机App或者语音即可控制电路通断,轻松实现原有家居设备的智能化改造。 随着智能家居概念的普及,越来越多的人想将自己的家改…

HuggingFace入门教程--环境搭建

HuggingFace中文直译为”拥抱脸“,是最近非常火爆的一个人工智能社区,官网地址是:https://huggingface.co/ .关于HuggingFace的相关介绍大家可以自行百度。本文主要为刚入人工智能坑的小白指下路,同时也是逼着自己记录下学习过程中…

【ctfshow】命令执行->web29-web44

前言 半夜网抑云听歌听emo了 z 刷会儿题不然睡不着了呜呜呜 红中(hong_zh0) CSDN内容合伙人、2023年新星计划web安全方向导师、 华为MindSpore截至目前最年轻的优秀开发者、IK&N战队队长、 吉林师范大学网安大一的一名普通学生、搞网安论文拿了回大挑校二、 阿里云专家博…

线性链表 反转 -(递归与非递归算法)_20230420

线性链表 反转 -(递归与非递归算法)_20230420 前言 线性链表反转是非常有趣的算法,它可以采用多种方式实现,比较简洁的方法是递归反转;传统的方式是利用迭代反转,设定三个变量,采用类似滚动数组的方式,实…

qt中使用 ui 文件进行界面设计

目录 1、创建 Qt 应用 ​2、项目创建成功 3、直接点击打开 mainwindow.ui 文件 4、随便从左边侧边栏拖拽一个空间到 界面设计区域 5、在右侧边栏右键点击 pushButton 控件,点击转到槽 6、根据实际需要选择对应的信号,我这里方便演示选择 clicked&a…

SpringCloud --- Ribbon负载均衡

一、负载均衡原理 SpringCloud底层其实是利用了一个名为Ribbon的组件,来实现负载均衡功能的。 那么我们发出的请求明明是http://userservice/user/1,怎么变成了http://localhost:8081的呢? 二、源码跟踪 为什么我们只输入了service名称就…

【博学谷学习记录】超强总结,用心分享 | 架构师 MinIO学习总结

文章目录 MinIO对象存储的概念计算机数据存储系统-架构模式对象存储的优势常见的对象存储系统/服务(Object Storage Service,OSS) MinIO简介特点高级特性小结 MinIO部署基于 linux Binary 部署 MinIO ServerMinIO数据组织结构MinIO Client**基…

ISO-27145故障诊断说明

ISO-27145故障诊断说明 2.1 27145目录说明 ISO27145-1: 这里边介绍的是一般信息和用例定义; ISO27145-2: 这里边介绍的是与排放相关的通用数据规则,用于查询; ISO27145-3: 这里边主要介绍了支持的服务 12服务 14服务 19服务 22服务 31服务&…

「C/C++」C/C++强制类型转换

博客主页:何曾参静谧的博客 文章专栏:「C/C」C/C学习 目录 相关术语C语言中的强制类型转换C中的强制类型转换static_castdynamic_castreinterpret_castconst_cast 注意事项 相关术语 强制类型转换:是指将一个数据类型强制转换为另一个数据类型…

Python初学小知识(十四):数据分析处理库Pandas

Python初学小知识(十四):数据分析处理库Pandas 十八 Pandas1 文件读取1.1 读取csv1.2 读取txt1.3 读取excel(xlsx) 2 内容读取2.1 读取行2.2 读取列 3 数据处理3.1 加减乘除3.1.1 列 与 元素3.1.2 列 与 列 3.2 最值、…