虚拟机JVM

news2024/11/20 18:47:38

虚拟机

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://www.coloradmin.cn/o/1475280.html

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

相关文章

备战蓝桥杯————k个一组反转单链表

k个反转单链表,顾名思义就是k个节点为一组进行反转,这是一道困难的题目,如何解答,可以在我们前面的反转链表中得到思路。 如何 K 个一组反转单链表 题目描述 给你链表的头节点 head ,每 k 个节点一组进行翻转&#xf…

四院士领衔,多位大学院校教授,3月齐聚泉城,2024发酵展即将盛装启幕!

2024济南生物发酵系列展同期举办 2024北方工业节能装备展 2024山东国际风机工业展 2024国际合成生物学产业展 2024国际生物制药与技术装备展 2024国际生化仪器与实验室装备展 2024山东国际卫生级流体、泵阀管道展 即将盛大开幕 30000平方米展示面积 500家知名企业参展…

完全分布式运行模式

完全分布式运行模式 分析:之前已经配置完成 ​ 1)准备3台客户机(关闭防火墙、静态ip、主机名称) ​ 2)安装JDK ​ 3)配置环境变量 ​ 4)安装Hadoop ​ 5)配置环境变量 ​ 6&am…

无人机飞行控制系统技术,四旋翼无人机控制系统建模技术详解

物理建模是四旋翼无人机控制系统建模的基础,主要涉及到无人机的物理特性和运动学特性。物理建模的目的是将无人机的运动与输入信号(如控制电压)之间的关系进行数学描述。 四旋翼无人直升机是具有四个输入力和六个坐标输出的欠驱动动力学旋翼…

Liunx前后端项目部署(小白也可安装)

文章目录 一、CentOS服务器的安装二、jdk安装三、Tomcat安装四、MySQL安装、五、nginX安装六、多个项目负载均衡,部署后端项目七、前端项目部署 一、CentOS服务器的安装 选择liunx,下面选择CentOS 7 ![在这里插入图片描述](https://img-blog.csdnimg.cn…

springboot之jdbc、druid、mybatis

springboot整合jdbc spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://192.168.52.3:3306/mybatis?useUnicodetrue&characterEncodingutf-8&serverTimezoneUTCusername: rootpassword: root<?xml version"1.0" encodi…

何恺明新作 l-DAE:解构扩散模型

何恺明新作 l-DAE&#xff1a;解构扩散模型 提出背景扩散模型步骤如何在不影响数据表征能力的同时简化模型&#xff1f;如何进一步推动模型向经典DAE靠拢&#xff1f;如何去除对生成任务设计的DDM中不适用于自监督学习的部分&#xff1f;如何改进DDM以专注于清晰图像表示的学习…

自动驾驶消息传输机制-LCM

需要用到LCM消息通讯&#xff0c;遂研究下。 这里写目录标题 1 LCM简介2. LCM源码分析3 LCM C教程与实例3.1 安装配置及介绍3.2 创建类型定义3.3 初始化LCM3.4 发布publish一个消息3.5 订阅和接收一个消息3.6 LCM进程间通讯3.7 注意事项&#xff1f;3.7.1 当数据结构定义的是数…

希亦、大宇、德国ODI三款哪款清洁力强?无广超声波清洗机实测!

最近超声波清洗机可见到非常火爆&#xff0c;一款产品在火爆的情况下都会有不信任的声音出现&#xff0c;超声波清洗机真的可以把眼镜洗干净吗&#xff1f;就一个超声波能洗东西&#xff1f;真的不是在交智商税吗&#xff1f;等等这种问题已经看到不止一次了&#xff0c;今天小…

uniapp:使用DCloud的uni-push推送消息通知(在线模式)java实现

uniapp:使用DCloud的uni-push推送消息通知&#xff08;在线模式&#xff09;java实现 1.背景 今天开发app的时候遇到一个需求&#xff1a; 业务在出发特定条件的时候向对应的客户端推送消息通知。 为什么选择在线模式&#xff0c;因为我们使用的是德邦类似的手持终端&#xf…

Linux环境安装jira

jira 是项目与事务跟踪工具&#xff0c;被广泛应用于缺陷跟踪、客户服务、需求收集、流程审批、任务跟踪、项目跟踪和敏捷管理等工作领域。 jira 软件安装包直接搜官网&#xff0c;然后可以选择免费的来下载&#xff1a; 安装 jira 之前&#xff0c;需要 Java 和 mysql 环境的…

unity初学问题:如何修改图片的坐标

如图&#xff0c;我们想要修改图片的轴心点坐标&#xff08;Pivot&#xff09; 选择图片组 打开编辑器在里面修改即可&#xff08;最下面的Custom Pivot&#xff09;

前端基础面试题(一)

摘要&#xff1a;最近&#xff0c;看了下慕课2周刷完n道面试题&#xff0c;记录下... 1.请说明Ajax、Fetch、Axios三者的区别 三者都用于网络请求&#xff0c;但维度不同&#xff1a; Ajax&#xff08;Asynchronous Javascript ang XML&#xff09;&#xff0c;是一种在不重新…

如何使用Logstash搜集日志传输到es集群并使用kibana检测

引言&#xff1a;上一期我们进行了对Elasticsearch和kibana的部署&#xff0c;今天我们来解决如何使用Logstash搜集日志传输到es集群并使用kibana检测 目录 Logstash部署 1.安装配置Logstash &#xff08;1&#xff09;安装 &#xff08;2&#xff09;测试文件 &#xff…

【DDD】学习笔记-领域驱动设计体系

从统一语言到限界上下文&#xff0c;从限界上下文到上下文映射&#xff0c;从领域分析建模到领域设计建模&#xff0c;再从领域设计建模到领域实现建模&#xff0c;我将软件架构设计、面向对象设计、场景驱动设计和测试驱动开发有机地融合起来&#xff0c;贯穿于领域驱动设计的…

mac打不开xxx软件, 因为apple 无法检查其是否包含恶意

1. 安全性与隐私下面的允许来源列表&#xff0c;有些版本中的‘任何来源’选项被隐藏了&#xff0c;有些从浏览器下载的软件需要勾选这个选项才能安装 打开‘任何来源’选项 sudo spctl --master-disable 关闭‘任何来源’选项 sudo spctl --master-enable

UE4c++ ConvertActorsToStaticMesh

UE4c ConvertActorsToStaticMesh ConvertActorsToStaticMesh UE4c ConvertActorsToStaticMesh创建Edior模块&#xff08;最好是放Editor模块毕竟是编辑器代码&#xff09;创建UBlueprintFunctionLibraryUTestFunctionLibrary.hUTestFunctionLibrary.cpp:.Build.cs 目标:为了大量…

探索IP地址定位工具:解读IP数据云的功能与优势

在当今数字化时代&#xff0c;IP地址定位工具成为了许多领域中不可或缺的技术支持&#xff0c;为网络安全、地理定位服务和个性化推荐等提供了重要数据支持。其中&#xff0c;IP数据云作为一种领先的IP地址定位工具&#xff0c;具有一系列功能和优势&#xff0c;本文将对其进行…

k8s service的概念以及创建方法

Service 的功能&#xff1a; Service主要用于提供网络服务&#xff0c;通过Service的定义&#xff0c;能够为客户端应用提供稳定的访问地址&#xff08;域名或IP地址&#xff09;和负载均衡功能&#xff0c;以及屏蔽后端Endpoint的变化&#xff0c;是K8s实现微服务的核心资源。…

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

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