JVM的深入理解

1、JVM(Java虚拟机):我们java编译时候,下通过把avac把.java文件转换成.class文件(字节码文件),之后我们通过jvm把字节码文件转换成对应的cpu能识别的机器指令(翻译官角色),我们发布一个Java程序,我们只需要发布.class文件即可,不同平台上的jvm是有差异的,对java提供的内容是一致的,但是对不同的操作系统来说是可能不一致的

一、JVM中的内存区域划分

1、jvm其实也是一个进程(任务管理器中看到的java进程),进程运行过程中要从操作系统这里申请一些资源(内存就是其中典型的资源),JVM从系统中申请了一大块内存,这一大块内存给Java程序使用的时候,又根据实际的使用用途划分出不同的空间

(1)堆:代码中new出来的对象,都是在堆里,对象中持有的非静态成员变量,也就是在堆里

(2)栈:本地方法栈(jvm内部的调用关系和局部变量)/虚拟机栈(java代码的调用关系和局部变量)包含了方法的调用关系和局部变量(一般不会关注本地方法栈,默认只得是虚拟机栈)此处中的堆和栈和数据结构中的堆和栈是不一样的

(3)程序计数器:这个区域比较小的空间,专门用来存储下一条要执行的java指令地址

(4)元数据区(以前叫方法区):往往只的是一些辅助性质的,描述性质的属性(例如:文件大小,文件的位置等,这些信息成为元数据)最主要的是保存类的信息,方法的信息,一个程序有哪些类,每个类里有哪些方法,每个方法里面要包含哪些指令,我们写的Java代码if,while,for各种逻辑运算都会被转换成字节码,最后将这些字节码存储到元数据区中,接下来就会按照上述元数据区里记录的字节码依次执行了,带有static变量的就是在类对象中,就存储在元数据区中

(5)堆只有一份,元数据区只有一份,栈和程序计数器可能由N份(每个线程都有自己的栈和程序计数器)

2、JVM的类加载机制

1、类加载指的是Java进程运行的时候,需要把.class文件从硬盘读到内存,并进行一系列的校验和解析的过程(从.class文件到类对象,从硬盘到内存)类加载分5步

(1)加载:把硬盘上的.class文件找到打开文件,读取到文件内容(认为读到的是二进制数据)

(2)验证:确保读到的文件内容是合法的.class文件(字节码文件)格式

(3)准备:给类对象申请内存空间(空间内什么都没有,是默认值全是零)

(4)解析:主要是针对类中的字符串常量进行处理,字符引用转换成直接引用:比如要存储字符串s=“hello”

因为文件中不存在地址这样的概念,地址是内存的地址但是我们这里是硬盘,所以我们需要用偏移量(这就叫符号引用)来找到文件中的hello,之后我们转换到内存上是此时就有地址(直接引用)了就不需要再用偏移量了

(5)初始化:针对类对象完成后续的初始化(还需要执行讲台代码的逻辑,还可能出发父类的加载)

3、双亲委派模型(描述了如何查找.class文件的策略)

1、JVM中进行类加载操作,是有一个专门的模块,称为“类加载器”,类加载器的作用,给他一个全限定类名,java.lang.String给定全限定类名之后找到对应的.class文件,下面是三类加载器,实际上类加载器只是一个父亲,也可以叫单亲

如果最后ApplicationClassLoader没有找到,因为ApplicationClassLoader没有孩子最后就会抛出ClassNotFoundException异常

(1)这样的操作也避免了我们自己写了类与标准类名重复,导致标准库类的功能失效

(2)我们也可以自己写类加载器,此时就不会涉及到双亲委派了

4、垃圾回收机制(GC)(避免内存泄漏问题)

(1)垃圾回收中有一个很重要的问题:STW问题,出发垃圾回收的时候,很可能会是当前程序和其他业务暂停,JAVA现在已经可以把STW的时间控制在1ms之内,影响就很小了

(2)垃圾回收是回收内存,程序计数器和栈不需要GC他们可以自行释放内存,元数据区一般不需要GC一般涉及到类加载,很少涉及到类卸载,堆是主要的GC区域(主要的就是回收对象)

4.1、垃圾回收我们要分两部展开:

(1)识别出垃圾(1.1-1.4)

(2)把标记为垃圾的对象的内存空间进行释放(2.1-)

识别出垃圾:

(1.1)在Java中,适用对象都需要通过引用的方式来使用(匿名对象是例外)

如果一个对象没有任何引用指向他,就是为无法被代码使用,就可以作为垃圾了

简单情况:

(1.2)

当我们局部变量t执行完,也就没有引用指向new Test()了此时new Test()就被认定成垃圾了

较复杂的情况(1.3)(1.4):

(1.3)引用计数:这种思想方法,并没有在JVM中使用,但是他的思想我们需要了解(给对象安排一个额外的空间,空间里要保存当前这个对象有多少个引用)

垃圾回收的时候,如果发现他的引用计数器为0了就定义为垃圾

引用计数器存在两个关键问题:

1)消耗额外的内存空间

2)引用计数可能产生循环引用问题,此时引用计数就无法工作了,这个问题就是可能会两个对象在内部分别对对方进行引用,导致计数器一直不为零

(1.4)可达性分析:本质上使用时间换空间,相比于引用计数,需要消耗额外的时间,是可控的,不会长生循环引用的问题,例如二叉树那样遍历访问,访问不到的就是垃圾

(2.1)把标记为垃圾的对象进行内存空间的释放

(2.2)标记-清除

(2.3)复制算法

将左边不是垃圾的对象复制到内存的另一边(内存碎片问题没了,但是使用的空间小了,而且如果数据很多复制两会很大,会增加很多开销)

(2.4)标记-整理,也能解决内存碎片问题

将后面的元素往前移将释放的垃圾覆盖掉,能解决内存碎片问题,但是移动复制成本依然很大

(2.5)分代回收(取长补短,非常好的回收方式,现在应用的 )

引入对象的年龄,JVM中有专门负责周期想扫面的线程,一个对象扫描一次,能扫描到就不是垃圾,年龄加1,不能扫描到就直接释放掉

第一轮扫描在伊甸区会有很多对象被消灭掉,剩下的线程年龄加1,转移到生存区,第二轮扫描伊甸区和上一轮一样,生存区左边扫描去掉大部分剩下的年龄加1转移到生存区的右边,如果经过若干轮的对象仍然健在,之后我们就转移到老年区,老年区不是不扫描,老年区的扫描频率会降低很多,如果扫描到为引用的对象直接也消灭掉掉

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

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

相关文章

TSINGSEE青犀AI智能分析网关V4智慧油田安全生产监管方案

一、方案背景 随着科技的不断发展,视频监控技术在油田行业中得到了广泛应用。为了提高油田生产的安全性和效率,建设一套智能视频监控平台保障安全生产显得尤为重要。本方案采用先进的视频分析技术、物联网技术、云计算技术、大数据和人工智能技术&#…

rhcsa(rh134)

shell 查看用户shell a、如下查看/etc/shells文件列出了系统上所有可用的 shell(具体的可用的 shell 列表可能会因不同的红帽版本和配置而有所不同) (如下图/etc/shells文件包含/bin/tmux并不意味着tmux是一个shell。实际上,/etc/…

Git自动忽略dll文件的问题

检查了半天发现是sourcetreee的全局忽略文件导致, 从里面删除dll即可。 我是干脆直接删了全局忽略,太恶心了,如下: #ignore thumbnails created by windows Thumbs.db #Ignore files build by Visual Studio *.exe .vsconfig .s…

去中心化时代,品牌如何赢得确定性增长

去中心化时代下,品牌面临众多挑战。在如今复杂的环境下,有很多不确定的因素,流量、资本等等,这些都是品牌发展过程中的不确定因素,越是复杂的环境下,品牌越要保证自己核心优势,找到并放大我们的…

网站添加pwa操作和配置manifest.json后,没有效果排查问题

pwa技术官网:https://web.dev/learn/pwa 应用清单manifest.json文件字段说明:https://web.dev/articles/add-manifest?hlzh-cn Web App Manifest:Web App Manifest | MDN 当网站添加了manifest.json文件后,也引入到html中了&a…

安卓使用okhttpfinal下载文件,附带线程池下载使用

1.导入okhttp包 implementation cn.finalteam:okhttpfinal:2.0.7 2.单个下载 package com.example.downloading;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle; import android.util.Log; import android.view.View;import java.io.File;import c…

K8S存储卷与PV,PVC

一、前言 Kubernetes(K8s)中的存储卷是用于在容器之间共享数据的一种机制。存储卷可以在多个Pod之间共享数据,并且可以保持数据的持久性,即使Pod被重新调度或者删除,数据也不会丢失。 Kubernetes支持多种类型的存储卷…

Python编程实验五:文件的读写操作

目录 一、实验目的与要求 二、实验内容 三、主要程序清单和程序运行结果 第1题 第2题 四、实验结果分析与体会 一、实验目的与要求 (1)通过本次实验,学生应掌握与文件打开、关闭相关的函数,以及与读写操作相关的常用方法的…

74HC04六角逆变器介绍

74HC04系列六角逆变器的输入包括钳位二极管,允许使用限流电阻将输入连接到高于 VCC 的电压。该小工具可使用 2.0 至 6.0 伏的电源工作。当使用上拉电阻时,器件输入与标准 CMOS 输出和 LSTTL 输出兼容。 74HC04基础参数 • 输出驱动能力:10 …

Avalonia学习(二十七)-显示图像

其实和Avalonia没有什么关系,但是还是以其它承载,主要是生成二维码。 主要是库:QRCoder 另外是:SixLabors.ImageSharp,ZXing.ImageSharp.Barcode 用image控件显示bitmap即可。 运行效果

ArmV8架构

Armv8/armv9架构入门指南 — Armv8/armv9架构入门指南 v1.0 documentation 上面只是给了一个比较好的参考文档 其他内容待补充

JS进阶——深入对象

构造函数 封装是面向对象思想中比较重要的一部分,js面向对象可以通过构造函数实现的封装。 前面我们学过的构造函数方法很好用,但是 存在浪费内存的问题 原型 目标:能够利用原型对象实现方法共享 构造函数通过原型分配的函数是所有对象所…

linux系统-----------搭建LNMP 架构

PHP(Hypertext Preprocessor 超文本预处理器)是通用服务器端脚本编程语言,主要用于web开发实现动态web页面,也是最早实现将脚本嵌入HTML源码文档中的服务器端脚本语言之一。同时,php还提供了一个命令行接口,因此,其也可…

resilience4j 2.0.0版本使用要求最低JDK17(使用踩坑记录)

文章目录 🔊博主介绍🥤本文内容📢文章总结📥博主目标 🔊博主介绍 🌟我是廖志伟,一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华大学出版社签约作…

如何选择科技公司或者技术团队来开发软件项目呢

最近有客户问我们为什么同样软件项目不同公司报价和工期差异很大,我们给他解释好久才讲清楚,今天整理一下打算写一篇文章来总结一下,有需要开发朋友可以参考,我们下次遇到客户也可以直接转发文章给客户自己看。 我们根据我们自己报…

vue项目中使用antv X6新手教程,附demo案例讲解(可拖拽流程图、网络拓扑图)

前言: 之前分别做了vue2和vue3项目里的网络拓扑图功能,发现对antv X6的讲解博客比较少,最近终于得闲码一篇了! 需求: 用户可以自己拖拽节点,节点之间可以随意连线,保存拓扑图数据后传给后端&…

TensorFlow 使用 Rust 指南

一、概述 TensorFlow是由 Google Brain 团队开发的强大的开源机器学习框架,已成为人工智能的基石。虽然传统上与 Python 等语言相关,但 Rust(一种因其性能和安全性而受到重视的系统编程语言)的出现为 TensorFlow 爱好者开辟了新的…

人工智能到深度学习:药物发现的机器智能方法(综述学习)

Artificial intelligence to deep learning: machine intelligence approach for drug discovery - PubMed (nih.gov) 人工神经网络、深度神经网络、支持向量机、分类和回归、生成对抗网络、符号学习和元学习是应用于药物设计和发现过程的算法的例子。人工智能已应用于药物设计…

定制开发一款家政小程序,应知应会

引言 在这个快节奏的现代生活中,人们对高效、便捷的家政服务的需求日益增加。随着社会结构的变化和职业生活的繁忙,许多家庭面临着时间不足、精力不济的挑战。在这种情况下,家政服务成为解决问题的有效途径。然而,传统的家政服务…

iMazing3安全吗?好不好用?值不值得下载

一、安全性 iMazing在设计和开发过程中,始终把用户数据的安全性放在首位。它采用了多种先进的安全技术来确保用户数据在传输、备份和存储过程中的安全。 iMazing3Mac-最新绿色安装包下载如下: https://wm.makeding.com/iclk/?zoneid49816 iMazing3Wi…