虚拟机JVM

虚拟机

1、定义

jvm 假想计算机 运行在操作系统之上 和硬件之间没有直接交互
包括 一套字节码指令、寄存器、栈、垃圾回收、堆 一个存储方法域
jvm:承担一个翻译工作,动态的将java代码编译成操作系统可以识别的机器码。
从软件层面屏蔽了不同操作系统在底层硬件与指令上的区别
jre:java 运行时环境 提供类库


类加载机制:7步


加载-验证-准备-解析-初始化-使用-卸载
加载:通过全限定类名来获取定义此类的二进制字节流/将字节流所代表的静态存储结构转化为方法区的运行时数据结构
验证:验证文件等格式
准备:变量字符开辟空间
解析:解析引用关系
初始化:赋值
启动类加载器 bootstrap ClassLoader c++ lib包 虚拟机能够识别的类库
扩展类加载器 exe lib/ext 能够被java使用
应用类加载器 appcation classpath 用户类路径 应用 的三方类库
不是继承关系 组合关系
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/3d313949db56488da7a97e445022e019.png)运行时数据区
执行引擎
2、java代码执行:

javac编译为.class文件
classLoader装载class
解释执行 编译执行class文件

3、内存管理

3.1结构
共享:
堆:创建的对象和数组都保存在堆内存中 采用分代收集算法
方法区:永久代,用于存储被jvm加载的类信息、常量、静态变量、即时编译后的代码等数据。
私有:栈、本地方法栈、程序计数器
栈:每个方法在执行的同时都会创建一个栈帧(用来存储数据和部分过程结果的数据结构),用来存储局部变量表,操作数栈,动态链接,方法出口等信息,
每一个方法从调用直至执行完成的过程,就应对着一个栈帧在虚拟机栈中入栈到出栈的过程。
在这里插入图片描述
运行时数据区

栈:

filo:first in last out
和方法调用相关
反汇编 javap -c math.class
局部变量表 istore_1 赋值
操作数栈 :iconst_1,iload(加载值),bipush(操作结果压栈)
动态链接:符号引用 方法区和栈之间(方法名称、类名都是一些符号)
方法出口:栈帧和栈帧之间 方法执行完回到主方法的栈位置
在这里插入图片描述

在这里插入图片描述

`

程序计数器

`私有,记录程序运行行数位置,因为java是多线程运行,可能当前线程运行一半,过来一个比当前线优先执行的线程,这样当前线程挂起,执行另一个线程,执行完后继续从当前虔诚的位置执行当前线程。字节码执行器动态修改
在这里插入图片描述

在这里插入图片描述
调优工具
jmap jstack arthas(*阿里巴巴)
stw:为了防止对象变量从垃圾和非垃圾之间来回切换
动态年龄判断机制 :如果对象大小大于s区百分之50,直接挪到老年代
内存比值
3.2内存分配 new Object
首选TLAB:(Thread Local Allocation Buffer)线程本地分配缓冲区

https://zhuanlan.zhihu.com/p/393972460
堆上分配(可能存在多线程安全问题)
new Object() 在堆内存中开辟一块内存空间,多线程并发在堆中开辟空间存在安全问题,但
加锁又会影响性能
所以就引出了 TLAB
new 对象会在堆中的eden区进行分配,分配结束后会进行一次yong gc ,如果对象没有被回收,存活年龄加1,达到15次,才会晋升到老年代,TLAB在eden区分配出私有的TLAB,并发创建也就不需要加锁了,如果分配的TLAB被用完,就会在公用的Eden区分配内存空间,所以堆区严格上说并不是线程共享。

栈上分配
在这里插入图片描述

垃圾回收

1、如何区分垃圾
引用计数法
可达性分析法:将gc roots对象作为起点,向下搜索引用的对象,找到的都标记为非垃圾对象
gcRoots 根节点:线程的本地变量、静态变量、本地方法栈的变量等
2、回收算法
1、标记清除法 碎片化严重
2、复制算法 解决碎片化 但效率低
3、标记整理算法 标记好不清楚 将存活的对象移动到内存的一端 然后清除端边界外的对象
4、常用的分代收集算法
核心思想:根据对象存活的不同生命周期将内存划分为不同的域
一般情况下将 GC 堆划分为老生代(Tenured/Old Generation)和新生代(Young
Generation)。老生代的特点是每次垃圾回收时只有少量对象需要被回收,新生代的特点是每次垃圾回收时都有大量垃圾需要被回收,因此可以根据不同区域选择不同的算法
新生代:复制算法
老年代 :标记复制算法
方法区的永生区 存储class类、常量方法 主要回收废弃的常量无用的类
5、分区收集算法
分为连续的不同小区间 每个小区间独立使用 独立回收

垃圾回收器

1、Serial 连续垃圾回收器(单线程、复制算法)
他工作其余的工作线程暂停 效率高,所以仍然是java虚拟机运行在client模式下默认的新生代垃圾回收器
2、ParNew 垃圾回收器(Serial+多线程 复制算法)
也需要暂停所有工作线程
ParNew垃圾收集器是很多 java虚拟机运行在 Server 模式下新生代的默认垃圾收集器
3、Parallel Scavenge 收集器(多线程复制算法、高效)
平行清除
它重点关注的是程序达到一个可控制的吞吐量(Thoughput,CPU 用于运行用户代码
的时间/CPU 总消耗时间,即吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)),高吞吐量可以最高效率地利用 CPU 时间,尽快地完成程序的运算任务,主要适用于在后台运算而不需要太多交互的任务。自适应调节策略也是 ParallelScavenge 收集器与 ParNew 收集器的一个重要区别
4、Serial Old 单线程标记整理算法
是serial 老年代版本 使用标记整理算法 默认老年代client的收集器
在 Server 模式下,主要有两个用途:

  1. 在 JDK1.5 之前版本中与新生代的 Parallel Scavenge 收集器搭配使用。
  2. 作为年老代中使用 CMS 收集器的后备垃圾收集方案。
    5、parallel Old收集器 多线程标记标记整理算法
    是parallel Scavenge 的老年代版本 1.6之后提供的
    两者搭配保障吞吐量
    6、CMS 收集器 多线程标记清除算法
    Concurrent mark sweep 老年代垃圾收集器
    7、G1收集器 多线程标记整理算法

java引用
强引用 把一个对象赋给一个引用变量,这个引用变量就是强引用,它处于可达状态不可能被回的 所以强引用是造成java内存泄漏的主要原因之一

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

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

相关文章

yolov9,使用自定义的数据训练推理

[源码 🐋]( GitHub - WongKinYiu/yolov9: Implementation of paper - YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information) [论文 📘](arxiv.org/pdf/2402.13616.pdf) 论文摘要:本文介绍了一种新的目标检测…

计算机网络-网络互连与互联网(三)

1.地址解析协议ARP: IP查询MAC地址,询问/回答机制。ARP缓存表、ARP欺骗、ARP病毒、代理ARP、反向RARP。 ARP、RARP分组格式如下: 2.地址解析协议ARP: 缓存表:开始-运行-cmd,输入arp -a(-s(绑…

MySQL的事务与隔离级别

1. 什么是事务? 数据库中的事务是指对数据库执行一批操作,而这些操作最终要么全部执行成功,要么全部失败,不会存在部分成功的情况。这个时候就需要用到事务。 最经典的例子就是转账,你要给朋友小白转 1000 块钱&…

JMeter学习(一)工具简单介绍

一、JMeter 介绍 Apache JMeter是100%纯JAVA桌面应用程序,被设计为用于测试客户端/服务端结构的软件(例如web应用程序)。它可以用来测试静态和动态资源的性能,例如:静态文件,Java Servlet,CGI Scripts,Java Object,数据库和FTP服务…

swagger-ui.html报错404,解决办法

swagger-ui.html报错404,解决办法!现在后端开发项目中,为了节省时间,使用swagger插件,可以方便的快捷生成接口文档。但是如果你在请求前端页面路径比如:http://127.0.0.1:7777/swagger-ui.html。找不到。那是因为你的配…

GEE错误——sentinel-2数据处理过程出现‘QA60‘ did not match any bands

在GEE中出现"QA60 did not match any bands"错误的原因可能是因为在GEE中搜索的数据信息中找不到与"QA60"相匹配的波段。这可能是由于以下几个原因导致的: 1. 数据库中没有包含"QA60"波段的信息。如果影像使用的日期较为新,可能会导致无法在…

k8s 进阶实战笔记 | NFS 动态存储类的部署与使用

文章目录 NFS 动态存储类的部署与使用演示环境说明NFS subdir external provisioner准备 NFS 服务器手动部署 NFS Subdir External Provisioner部署 StorageClass验证使用更多信息 NFS 动态存储类的部署与使用 演示环境说明 演示环境信息:单机K3s 1.28.2 操作系统…

Rust-windows安装环境

文章目录 前言一、Using rustup (Recommended)二、配置vscode解决办法:在终端依次运行如下两条指令: 总结 前言 Rust学习系列,之前介绍了macOS环境下的rust安装方式macOS rust安装。这篇学习windows的rust安装方式。 提示:以下是…

注解@requestBody @requestParam@RequestHeader的区别和使用方式

总的来说,RequestBody用于接收请求体数据,RequestParam用于获取请求参数,RequestHeader用于获取请求头信息 requestBody requestBody 通常在POST请求中,用于指示一个方法参数应该绑定到Web请求的正文部分。通常用于接收JSON或XM…

几种常见的数据模型

什么式数据模型:数据如果要被存储记录或者分析,要有一个组织形式,那么,怎么把数据按照一定规律组织呢,这个就是数据模型数据模型分类 平面模型:或者称为二维模型,通过行列坐标确定数据的形式 纵…

银河麒麟桌面版操作系统密码复杂度设置

这里是桌面版的使用,资深使用者可以使用命令一键修改,这里面不涉及 1密码复杂度设置 1.1开始菜单,选择设置 快捷键wini也可以 1.2打开账户设置 1.3在安全中心的账号保护中 1.4推荐的是默认的策略 密码强度使用默认推荐的就可以&#xf…

电脑缺失XInput1_4.dll文件的解决办法

在电脑操作中,有用户遇到了XInput1_4.dll文件缺失的问题,导致一些依赖该文件的电脑应用无法正常运行,从而影响用户正常使用。接下来小编分享不同的解决方法,帮助用户轻松解决该问题,找回XInput1_4.dll文件,…

单片机文件系统

下载地址 FatFs - Generic FAT Filesystem Module (elm-chan.org)

四川尚熠电子商务有限公司抖音带货可靠吗?

在当今数字化时代,电子商务的兴起使得越来越多的企业开始涉足这一领域。四川尚熠电子商务有限公司作为其中的一员,提供抖音带货服务,吸引了众多商家的关注。那么,四川尚熠电子商务有限公司的抖音带货服务究竟可靠吗?本…

分享泰国市场的一些现状

最近和一个泰国的客户聊天,然后聊起来说从去年开始很多的中国人来到他们那边去建设工厂,因此还在当地形成了一个中国村,在这个中国村里有中国的各种商店,而且居住的也主要是中国人。 从前年开始我们都在讨论中国的一些工厂可能因为…

算法--贪心

这里写目录标题 区间问题区间选点引入算法思想例题代码 最大不相交区间的数量算法思想例题代码 区间分组算法思想例题代码 一级目录二级目录二级目录二级目录 区间问题 区间选点 引入 区间问题会给定几个区间,之后要求我们在数轴上选取尽量少的点,使得…

掌握微信小程序开发的核心要点:从基础到进阶

文章目录 掌握微信小程序开发的核心要点:从基础到进阶一、数据绑定和事件处理1.1 理解小程序的数据绑定机制,实现数据和视图的同步更新1.2 学习如何处理用户交互事件和触发相应的响应逻辑 二、网络请求和数据交互2.1 使用小程序的网络请求API与后端服务器…

智能充电桩案例分析——交流充电桩

随着电动汽车的发展,充电桩也成为当下的一个很热门的工业产品。我们初步接触充电桩,有了点滴的感受。 先简单说说容易一点的交流充电桩。就是通过市电(220V,50赫兹)给电动汽车提供充电的能源来源。很容易理解,交流…

亿道丨三防平板丨如何从多方面选择合适的三防加固平板?

在如今这个信息爆炸的时代,移动设备已经成为我们生活和工作的必备工具。然而,在一些特殊的场合中,普通的平板电脑可能无法满足需求,比如工厂车间、野外作业、极端天气等环境下。此时,三防平板就成了不二之选。那么&…

以太网中的Pause帧格式

一、PAUSE帧概念 PAUSE帧是以太网在全双工模式下,MAC控制子层发出的流量控制帧。IEEE802.3协议为MAC控制子层提供了一个全双工流量控制结构框架,MAC控制子层是介于逻辑链路控制子层和介质访问控制子层间的可选功能。 交换控制电路要防止缓冲区溢出&…